Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在模块中使用self_Ruby - Fatal编程技术网

Ruby 在模块中使用self

Ruby 在模块中使用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,这有什么区别?区别在于第一个

以下两个例子之间有区别吗?在第二个示例中,是否可能因为方法名而导致方法冲突?模块中的方法不是自动“封装”在此模块中吗

例1

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
    导入它才能使用。