在继承的方法上使用 mixin 方法

Use mixin method over inherited one

假设我创建了以下 class:

class Node < Struct.new(:data, :left, :right)
  def each(&block)
    ...
  end
end

如您所知,selectStructEnumerable 定义(后者包含在 Struct 中)。

如何 Node.new.select 触发 Enumerable 的实现而不是 Struct 的实现?我需要这个的原因是我已经为我的 class 实现了自定义 each 并且我希望 select 使用它(因此我需要 Enumerable#select)。

如果你能修改Node的源代码,那就让它prepend Enumerable代替include Enumerable

如果不行,那你可以从Enumerable抓取实例方法selectbindNode的实例,然后call它。

node = Node.new(...)
Enumerable.instance_method(:select).bind(node).call

像这样:

class Node < Struct.new(:data, :left, :right)
  #... 
  define_method(:select, Enumerable.instance_method(:select)) 
end

无耻外挂:这是RubyTapas #466, "Ancestral Behavior"

的话题