假设我创建了以下类:
class Node < Struct.new(:data, :left, :right)
def each(&block)
...
end
end
如您所知,select
和Struct
定义了Enumerable
(后者包含在Struct
中)。
如何执行Node.new.select
并触发Enumerable
的实施而不是Struct
的实施?我需要这个的原因是我已经为我的课程实现了自定义each
,我希望select
能够使用它(因此我需要Enumerable#select
)。
答案 0 :(得分:2)
如果您可以修改Node
的源代码,请将其prepend Enumerable
代替include Enumerable
。
如果你不能,那么你可以从select
和Enumerable
获取实例方法bind
到Node
的实例,然后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
的主题