看起来这两段代码做同样的工作,但我想明白为什么我宁愿使用一个或另一个
第一个例子:
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
Ruby 还提供了辅助方法 module_function
以这种方式定义方法:
module MyModule
def first_method
end
module_function :first_method
end
它将方法添加为类方法并使实例方法私有(private)。 Kernel
中的方法就是这样工作的。
关于ruby-on-rails - 在模块中扩展 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55534581/