You can call include to mixin a module with a class in ruby, but it must be done at the beginning of the class definition. Why can’t it be done inside a class function? Is there an alternate syntax?
EX:
module UsefulThings
def a() puts "a" end
end
class IncludeTester
include UsefulThings
def initialize
end
end
n = IncludeTester.new
n.a()
^^ This works, but if I change IncludeTester to the following, I get the error “undefined method `include'”
class IncludeTester
def initialize
include UsefulThings
end
end
It can be done in a class method.
This works:
But “initialize” is not a class method, it’s an instance method.
“new” is a class method. You can think of new as allocating a new object and then calling initialize on it, passing initialize whatever arguments were passed to new.
You can’t call include directly in initialize because include is a private method of Class (inherited from Module), not of the newly created IncludeTester instance.
If you want to include a module into a class from an instance method, you have to do something like this:
It’s necessary to use “send” here because include is private method, which means it can only be directly invoked with an implicit receiver (of self).
When you call initialize normally in a class definition, you’re actually calling it with an implicit receiver of “self”, referring to the class being defined.
This is what is actually happening when you do this: