“扩展自我”与“module_function”相同吗?

extend selfmodule_function是两个ruby的方式,使您可以调用一个模块上的方法,也调用它,如果你包括该模块。

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

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

 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 Ma Mb # NoMethodError: private method `b' called for M:Module Nc Nd 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