gpt4 book ai didi

ruby - 在模块中使用 self

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:17 25 4
gpt4 key购买 nike

下面两个例子有区别吗?由于方法名称,是否有可能在第二个示例中出现方法冲突?模块中的方法不是自动“封装”在该模块中吗?

示例 1

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

示例 2

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

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

最佳答案

区别在于第一个例子定义了模块方法调用preview,第二个例子定义了mixin方法 预览

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

NoMethodError: undefined method preview for Foo:Class

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

  1. 来自对象的单例/元/本征类的方法
  2. 来自前置模块的方法(Ruby 2.0+ 特性)
  3. 对象类的方法
  4. 来自包含模块的方法
  5. 来自类层次结构的方法(父类(super class)及其祖先)

当找到方法时,方法查找停止。

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

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

所以不可能有冲突。

关于ruby - 在模块中使用 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com