似乎这两段代码可以完成相同的工作,但我想了解为什么我宁愿使用一个或另一个
第一个示例:
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
答案 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
中的方法就是这样。