模块中的“extend self”和module_function:name_of_method有什么区别?

时间:2014-09-17 16:48:47

标签: ruby

模块中“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。

1 个答案:

答案 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)