红宝石对象可以称其为“祖父母”超级吗?

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

Bor*_*cky 5

是的,有一种方法可以完成您要描述的事情,并且可以通过方法#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的其他答案)