gpt4 book ai didi

ruby - ruby 对象可以在 "grandparent"上调用 super 吗?

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

如果我有一个 Salad 类,它有一个 chew 方法,并且我在其中使用了 super,它将调用下一个可用的 chew 方法可以沿着祖先链向上移动。如果我想“达到两个级别”(到第二个可用的 chew 方法上升链)怎么办?有没有办法不在第一个祖先的方法中添加 super 来做到这一点?

为了更具体一点,假设这是我的 Salad 类,有一个 salad 对象:

class Salad < Food
include Almonds
include Gorgonzola
include Spinach
include Dressing

def chew
super
end
end

salad = Salad.new

祖先的数组是这样的:

[Salad, Dressing, Spinach, Gorgonzola, Almonds, Food, Object, Kernel, BasicObject]

如果我想让 salad.chewSpinach 中触发 chew 方法而不添加 super 到 Dressing#咀嚼,这可能吗?有没有办法达到两级以上(与 super “达到”一级相同的方式)?

最佳答案

是的,有一种方法可以完成您所描述的事情,这种方法是通过方法 #method#instance_method,如 method = Spinach .instance_method( :chew ),然后您可以将其绑定(bind)到 Salad,或绑定(bind)到 Salad 实例的元类,如 method.bind(Salad) 中所示。这种机制不像使用便利关键字 super 那样简洁,但提供了 super 功能的超集。还有一些细节,但相信我,这样,你可以做任何你想做的事。这就是 Ruby 的力量——你可以做任何事情,直到 Lispiest 魔术,你需要 Ripper,和(迄今为止未完成的)Sorcerer .

(有关用法示例,请参阅我在 Using the Object.inspect / Object.to_s on a class derived from Hash 的其他答案)

关于ruby - ruby 对象可以在 "grandparent"上调用 super 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16629803/

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