在模块中使用self

时间:2014-09-09 17:50:52

标签: ruby

以下两个例子之间有区别吗?由于方法名称,是否可能在第二个示例中获取方法冲突?模块中的方法是否自动“封装”在此模块中?

示例1

module ImageUtils
  def self.preview(image)
    #do something
  end
end

示例2

module ImageUtils
  def preview(image)
    #do something
  end
end

如果我将所有内容放入模块Foo中的课程ImageUtils中,会有什么不同?

1 个答案:

答案 0 :(得分:8)

不同之处在于,第一个示例定义了名为preview 模块方法 ,第二个示例定义了 mixin方法 < / strong> preview

因此,如果将第一个模块包含在类中,您将能够在类上调用此方法(而在类实例上调用该方法会导致错误),而将第二个模块包含在类中将允许您在类'实例上调用该方法,但在类本身上调用该方法将导致

NoMethodError: undefined method preview for Foo:Class

关于基于包含在类和模块中的相同方法名称的冲突。这个问题的答案存在于Ruby方法查找中,其中包括:

  1. 来自对象的singleton / meta / eigen类的方法
  2. 来自前置模块的方法(Ruby 2.0+功能)
  3. 来自对象类的方法
  4. 包含模块的方法
  5. 类层次结构中的方法(超类及其祖先)
  6. 找到方法后,方法查找停止。

    使用prepend,mixin方法在方法查找中具有优先权;

    在类中定义的include方法在方法查找中具有优先权。

    因此不存在任何冲突。