Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is "extend self" the same as "module_function"?

Tags:

module

ruby

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?

like image 981
Adrian Avatar asked Mar 01 '10 01:03

Adrian


People also ask

What is Module_function in Ruby?

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.

What is the difference between extend and include in Ruby?

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 Ruby?

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).


1 Answers

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 
like image 96
rubiii Avatar answered Sep 23 '22 06:09

rubiii