ico*_*ast 2 ruby metaprogramming
如果我有一个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
Run Code Online (Sandbox Code Playgroud)
祖先的排列如下:
[Salad, Dressing, Spinach, Gorgonzola, Almonds, Food, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
如果我想在不添加Dressing#chew的情况下salad.chew触发chew方法,那可能吗?有没有办法达到两个级别的提升(就像 “达到”一个级别的提升一样)?Spinachsupersuper
是的,有一种方法可以完成您要描述的事情,并且可以通过方法#method和来完成#instance_method,如中所述method = Spinach.instance_method( :chew ),然后可以将其绑定到Salad,或者绑定到Salad实例的元类,如method.bind( Salad )。这种机制不像使用便捷关键字那样整洁super,但是提供了super的功能的超集。还有更多细节,但是请相信我,这样,您可以做任何您想做的事情。这就是Ruby的强大功能-您可以做任何事情,直到Lispiest魔术需要的Ripper(到目前为止尚未完成)Sorcerer。
(有关用法示例,请参见在从Hash派生的类上使用Object.inspect / Object.to_s的其他答案)