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



说我创建以下类:

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

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

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

如果您可以修改Node的源代码,则让它prepend Enumerable而不是include Enumerable

如果不能,那么您可以从Enumerable中获取实例方法select,然后bind将其抓取到Node的实例,然后callIT。

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的话题,"祖先行为"

最新更新