代码之家  ›  专栏  ›  技术社区  ›  Adrian

“扩展自我”是否与“模块功能”相同?

  •  40
  • Adrian  · 技术社区  · 15 年前

    extend self module_function 有两种Ruby方法可以实现它,这样您就可以在模块上调用方法,如果包含该模块,也可以调用它。

    这些方法的最终结果有什么不同吗?

    1 回复  |  直到 9 年前
        1
  •  55
  •   Andrew Marshall    9 年前

    module_function 将给定的实例方法设为私有,然后复制并将它们作为公共方法放入模块的元类中。 extend self 将所有实例方法添加到模块的singleton中,使其可见性保持不变。

    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