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