在模块中扩展自身

时间:2019-04-05 11:41:21

标签: ruby-on-rails ruby

似乎这两段代码可以完成相同的工作,但我想了解为什么我宁愿使用一个或另一个

第一个示例:

module MyModule 
  extend self

  def first_method
  end

  def second_method
  end

end

第二个示例:

module MyModule 

  def self.first_method
  end

  def self.second_method
  end

end

1 个答案:

答案 0 :(得分:7)

您的第一个示例定义了两个实例方法,并使它们也可以通过extend作为类(或模块)方法使用:

module MyModule 
  def first_method; end
  def second_method; end
end

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> []

MyModule.extend MyModule

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> [:second_method, :first_method]

第二个示例仅定义了两个类(或模块)方法,没有实例方法:

module MyModule 
  def self.first_method; end
  def self.second_method; end
end

MyModule.instance_methods         #=> []
MyModule.methods - Module.methods #=> [:second_method, :first_method]

当您要提供一些可以称为的实用工具功能时,第一个变体可能会很有用:

MyModule.first_method

或包含在其他模块/类中

class Foo
  include MyModule

  def another_method
    first_method     # <- no explicit receiver needed
  end
end

Ruby还提供了辅助方法module_function来定义该方法:

module MyModule
  def first_method
  end
  module_function :first_method
end

它将方法添加为类方法,并使实例方法为 private Kernel中的方法就是这样。