以下两个例子之间有区别吗?由于方法名称,是否可能在第二个示例中获取方法冲突?模块中的方法是否自动“封装”在此模块中?
示例1
module ImageUtils
def self.preview(image)
#do something
end
end
示例2
module ImageUtils
def preview(image)
#do something
end
end
如果我将所有内容放入模块Foo
中的课程ImageUtils
中,会有什么不同?
答案 0 :(得分:8)
不同之处在于,第一个示例定义了名为preview
的 模块方法 ,第二个示例定义了 mixin方法 < / strong> preview
。
因此,如果将第一个模块包含在类中,您将能够在类上调用此方法(而在类实例上调用该方法会导致错误),而将第二个模块包含在类中将允许您在类'实例上调用该方法,但在类本身上调用该方法将导致
NoMethodError: undefined method preview for Foo:Class
关于基于包含在类和模块中的相同方法名称的冲突。这个问题的答案存在于Ruby方法查找中,其中包括:
找到方法后,方法查找停止。
使用prepend
,mixin方法在方法查找中具有优先权;
在类中定义的include
方法在方法查找中具有优先权。
因此不存在任何冲突。