使用mixin方法而不是继承方法

时间:2017-03-09 22:38:05

标签: ruby inheritance mixins

假设我创建了以下类:

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您可以修改Node的源代码,请将其prepend Enumerable代替include Enumerable

如果你不能,那么你可以从selectEnumerable获取实例方法bindNode的实例,然后call

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

答案 1 :(得分:1)

像这样:

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

无耻插件:这是RubyTapas #466, "Ancestral Behavior"

的主题