Ruby 在模块中使用self
以下两个例子之间有区别吗?在第二个示例中,是否可能因为方法名而导致方法冲突?模块中的方法不是自动“封装”在此模块中吗 例1Ruby 在模块中使用self,ruby,Ruby,以下两个例子之间有区别吗?在第二个示例中,是否可能因为方法名而导致方法冲突?模块中的方法不是自动“封装”在此模块中吗 例1 module ImageUtils def self.preview(image) #do something end end 例2 module ImageUtils def preview(image) #do something end end 如果我将所有内容都放入模块ImageUtils中的类Foo,这有什么区别?区别在于第一个
module ImageUtils
def self.preview(image)
#do something
end
end
例2
module ImageUtils
def preview(image)
#do something
end
end
如果我将所有内容都放入模块
ImageUtils
中的类Foo
,这有什么区别?区别在于第一个示例定义了名为预览的模块方法,第二个示例定义了混合方法预览
因此,如果在类中包含第一个模块,则可以在类上调用此方法(而在类实例上调用此方法会导致错误),而在类中包含第二个模块将允许在类实例上调用此方法,但在类本身上调用此方法会导致错误
NoMethodError: undefined method preview for Foo:Class
关于类和包含在其中的模块中基于相同方法名的冲突。这个问题的答案在于Ruby方法查找,如下所示:
对象的singleton/meta/eigen类中的方法
来自前置模块的方法(Ruby 2.0+功能)
对象类中的方法
包含模块中的方法
类层次结构(超类及其祖先)中的方法
找到方法时,方法查找停止
使用prepend
时,mixin方法在方法查找中具有优先权
使用include
时,类中定义的方法在方法查找中具有优先权
所以不可能有冲突。我知道类和实例方法,只是想确保它不会真正改变名称空间的工作方式。这只是一个关于方法用法的问题-它将用于类还是其实例技术上它不是一个类方法,而是一个单例类的实例方法。类方法属于类。这是一个可以直接访问的模块方法。我倾向于通过将第一个示例称为“module method”和第二个示例称为“mixin method”来区分这两种类型,因为必须使用include
导入它才能使用。