在模块中使用self

xot*_*tix 3 ruby

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

例1

module ImageUtils
  def self.preview(image)
    #do something
  end
end
Run Code Online (Sandbox Code Playgroud)

例2

module ImageUtils
  def preview(image)
    #do something
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我将所有内容放入Foo模块中的一个类中ImageUtils,它会有什么不同?

And*_*eko 8

区别在于第一个示例定义了调用的模块方法preview,第二个示例定义了mixin方法 preview.

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

NoMethodError: undefined method preview for Foo:Class
Run Code Online (Sandbox Code Playgroud)

关于基于类和方法中包含的相同方法名称的冲突.回答这个问题的方法是Ruby方法查找,如下:

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

找到方法后,方法查找停止.

使用prependmixin方法将在方法查找中具有优先权;

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

所以不可能发生冲突.

  • 类方法属于类.这是一种可直接访问的模块方法.我倾向于通过将第一个示例称为"模块方法"来区分这两种类型,而将第二个示例称为"mixin方法",因为它必须先使用`include`导入才能使用它. (3认同)