extend self
和module_function
是实现它的两种方法,因此您可以在模块上调用方法,并在包含该模块时调用它。
这些方式的最终结果之间是否存在差异?
答案 0 :(得分:55)
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
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