extend self
and module_function
are two ruby ways to make it so you can call a method on a module and also call it if you include that module.
Are there any differences between the end results of those ways?
module_function(*args) private. Creates module functions for the named methods. These functions may be called with the module as a receiver, and also become available as instance methods to classes that mix in the module. Module functions are copies of the original, and so may be changed independently.
In simple words, the difference between include and extend is that 'include' is for adding methods only to an instance of a class and 'extend' is for adding methods to the class but not to its instance.
What is the difference between a class and a module? Modules are collections of methods and constants. They cannot generate instances. Classes may generate instances (objects), and have per-instance state (instance variables).
module_function
makes the given instance methods private, then duplicates and puts them into the module's metaclass as public methods. extend self
adds all instance methods to the module's singleton, leaving their visibilities unchanged.
module M extend self def a; end private def b; end end module N def c; end private def d; end module_function :c, :d end class O include M include N end M.a M.b # NoMethodError: private method `b' called for M:Module N.c N.d O.new.a O.new.b # NoMethodError: private method `b' called for O O.new.c # NoMethodError: private method `c' called for O O.new.d # NoMethodError: private method `d' called for O
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With