gpt4 book ai didi

ruby - 在 Ruby 中扩展模块时内部会发生什么?

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

Foo = Module.new

class MyClass
include Foo
end

当一个模块包含在一个类中时,会创建一个匿名代理类并将其设置为 MyClass 的父类(super class)。

MyClass.ancestors => [MyClass, Foo, ...]

但是当一个模块被扩展时内部会发生什么? Ruby 如何处理这个问题?

最佳答案

我想你问的是 Object#extend

所以通过extend,我可以包含任何模块的方法到那个对象中。例如,我有一个名为 HelperModule 的模块:

module HelperModule
def foo
puts "from module helper"
end
end

使用示例1:

obj = Object.new
obj.extend HelperModule
obj.foo # => "from module helper"

使用示例 2:

class MyClass
extend HelperModule
end
MyClass.foo # => "from module helper"

内部,根据Metaprogramming Ruby :

Object#extend() is simply a shortcut that includes a module in the receiver’s eigenclass.


ruby 方法调用的简单解释:

  1. 找到对象所在的类,看里面是否定义了方法
  2. 找到那个类的父类(super class),看看是否有定义的方法

obj 
|
| class
| superclass superclass
---> ObjectClass --------------> SuperClass1 --------------> SuperClass2 ....

关于特征类和方法调用路径的详细解释,请引用这本好书Metaprogramming Ruby

谢谢

关于ruby - 在 Ruby 中扩展模块时内部会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833991/

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