include : Mixes in specified module methods as instance methods in the target class
extend : Mixes in specified module methods as class methods in the target class
Example :-
module ReusableModule
def module_method
puts "Module Method: Hi there!"
end
end
class ClassThatIncludes
include ReusableModule
end
class ClassThatExtends
extend ReusableModule
end
puts "Include"
ClassThatIncludes.new.module_method
=> "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method
=> "Module Method: Hi there!"
If you include module ReusableModule in class ClassThatIncludes, the methods, constants, classes, submodules, and other declarations gets referenced.
include is a private method, because it's intended to be called from within the container class/module.
If you extend class ClassThatExtends with module ReusableModule, then the methods and constants gets copied. Obviously, if you are not careful, you can waste a lot of memory by dynamically duplicating definitions.
extend is a public method.
extend - adds the specified module's methods and constants to the target's metaclass (i.e. the singleton class. For ex :
* if you call Klazz.extend(Mod), now Klazz has Mod's methods (as class methods)
* if you call obj.extend(Mod), now obj has Mod's methods (as instance methods), but no other instance of of obj.class has those methods.
extend is a public method
extend : Mixes in specified module methods as class methods in the target class
Example :-
module ReusableModule
def module_method
puts "Module Method: Hi there!"
end
end
class ClassThatIncludes
include ReusableModule
end
class ClassThatExtends
extend ReusableModule
end
puts "Include"
ClassThatIncludes.new.module_method
=> "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method
=> "Module Method: Hi there!"
If you include module ReusableModule in class ClassThatIncludes, the methods, constants, classes, submodules, and other declarations gets referenced.
include is a private method, because it's intended to be called from within the container class/module.
If you extend class ClassThatExtends with module ReusableModule, then the methods and constants gets copied. Obviously, if you are not careful, you can waste a lot of memory by dynamically duplicating definitions.
extend is a public method.
extend - adds the specified module's methods and constants to the target's metaclass (i.e. the singleton class. For ex :
* if you call Klazz.extend(Mod), now Klazz has Mod's methods (as class methods)
* if you call obj.extend(Mod), now obj has Mod's methods (as instance methods), but no other instance of of obj.class has those methods.
extend is a public method