Ruby 关于多个类#扩展调用

Ruby 关于多个类#扩展调用,ruby,decorator,singleton-methods,Ruby,Decorator,Singleton Methods,考虑以下代码: 之所以是2.6而不是2.2,是因为extend的每次调用都会将一个模块添加到实例单例类祖先链中,如下所述。您总是只需要#cost,它会被未来的参数修改-这不是被覆盖的问题: coffee = Coffee.new #cost is 2 coffee.extend(Milk) #cost is 2.4 coffee.extend(Sugar) #cost is 2.6 这篇文章说,这个实现与他们给出的其他基于继承的示例相同 extend添加到祖先列表中,它不会替换任何现有的祖先

考虑以下代码:



之所以是2.6而不是2.2,是因为
extend
的每次调用都会将一个模块添加到实例单例类祖先链中,如下所述。

您总是只需要
#cost
,它会被未来的参数修改-这不是被覆盖的问题:

coffee = Coffee.new
#cost is 2
coffee.extend(Milk)
#cost is 2.4
coffee.extend(Sugar)
#cost is 2.6

这篇文章说,这个实现与他们给出的其他基于继承的示例相同

extend
添加到祖先列表中,它不会替换任何现有的祖先-如果您检查
coffee.singleton\u class.existents
在第二次扩展后,您可以看到它既包括
牛奶
也包括

如果您正在运行2.2,则可以使用新的
super\u方法
方法来检查:

coffee.method(:cost) => #<Method: Coffee(Sugar)#cost>

当您从那里调用super时,您将进入基类实现

我不明白。我的假设是,当
成本
方法替换为模块中相同的命名方法时。你是说混合模块中的两个
成本
方法共存?但那不是真的,因为
咖啡.单例方法
返回
[:cost]
,即使在第二次
#扩展
。不,我是说它们并不共存-当你
扩展(牛奶)
时,最初的
#cost
现在是
cost+0.4
——因此进一步的扩展使用它作为基础,您的意思是连接方法的源代码?这似乎是不现实的。嗯,事实证明我忽略了牛奶和糖进入食物链这一事实。为什么我认为他们没有?非常感谢你指出这一点。
coffee.method(:cost).super_method => #<Method: Coffee(Milk)#cost>
coffee.method(:cost).super_method => #<Method: Coffee(Milk)#cost>
coffee.method(:cost).super_method.super_method => #<Method: Coffee#cost>