模块中“extend self”与module_function:name_of_method有什么区别?
示例:
module Foo
def bar
puts 'hi from bar'
end
def buu
puts 'hi from buu'
end
extend self
end
与
module Foo
def bar
puts 'hi from bar'
end; module_function :bar
def buu
puts 'hi from buu'
end; module_function :buu
end
module_function在哪一点上等同于扩展self?
现在我似乎主要使用“扩展自我”而且几乎没有 module_function。
答案 0 :(得分:1)
extend self
将所有方法添加为静态方法 - 但它们仍然是模块方法。这意味着当你从一个类扩展模块时,该类将获得这些方法。
module_function
,除了使方法成为模块方法之外,还使原始方法成为私有方法。这意味着您将无法从扩展模块的对象外部使用这些方法。
您可以在此示例中看到不同之处:
module Foo
def bar
puts 'hi from bar'
end
def buu
puts 'hi from buu'
end
extend self
end
module Bar
def bar
puts 'hi from bar'
end; module_function :bar
def buu
puts 'hi from buu'
end; module_function :buu
end
class A
extend Foo
end
class B
extend Bar
end
Foo::bar
A::bar
Bar::bar
B::bar #Error: private method `bar' called for B:Class (NoMethodError)