gpt4 book ai didi

ruby - 扩展 ruby 对象; extend_object 回调阻止实例方法被扩展

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

使用模块扩展对象实例时遇到一些问题,特别是当我在 Module 类中定义 extend_object 回调时。我的理解是,当您执行以下操作时:

(s = String.new).extend SomeModule

调用 SomeModule extend_object 回调。情况似乎是这样,但是当我包含回调时,SomeModule 中定义的所有实例方法在对象中都不可见。一些代码应该更好地解释这一点:

module M1
def self.extend_object(o)
end

def test_method
true
end
end

module M2
def test_method
true
end
end

(x = String.new).extend(M1)
(y = String.new).extend(M2)

然后,

x.methods.include?("test_method")
=> false
y.methods.include?("test_method")
=> true

更具体地说,

x.singleton_methods
=> []
y.singleton_methods
=> ["test_method"]

有什么想法吗?

引用:

http://www.ruby-doc.org/core/classes/Module.html#M001660
http://www.ruby-doc.org/core/classes/Object.html#M000337

最佳答案

您应该使用extended 回调而不是覆盖extend_object。当一个对象被你的模块扩展时,第一个被调用。后者被调用以实际扩展对象。这就像 includedappend_features 之间的区别。

这是一个例子:

module M1
def self.extended(base)
puts "extended object #{base.inspect}"
end

def test_method
true
end
end

然后:

>> (x = String.new).extend(M1)
extended object ""
=> ""

>> x.methods.include?("test_method")
=> true

关于ruby - 扩展 ruby 对象; extend_object 回调阻止实例方法被扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/896714/

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