Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在模块中扩展self_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在模块中扩展self

Ruby on rails 在模块中扩展self,ruby-on-rails,ruby,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 第一个示例定义了两个实例方法,并通过extend

看起来这两段代码的作用是一样的,但我想理解为什么我宁愿使用其中一段代码

第一个示例:

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

第一个示例定义了两个实例方法,并通过
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

它将方法添加为类方法,并使实例方法私有。这是<>代码>内核>代码>的工作方式。

谢谢你花时间和你的明确例子:既然你已经走了这么远,还考虑了<代码>自包含。(KLASS)习惯用法,包括一些方法和扩展其他。这是一个纯粹的Ruby问题,所以它不应该有一个Rails标签。一个结果是,过滤掉Rails问题(而不是Ruby问题)的读者将看不到您的问题。
module MyModule
  def first_method
  end
  module_function :first_method
end