Is “extend self” the same as “module_function”?

后端 未结 1 532
小鲜肉
小鲜肉 2020-12-07 16:42

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.

相关标签:
1条回答
  • 2020-12-07 17:09

    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
    
    0 讨论(0)
提交回复
热议问题