说我创建以下类:
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
)。
如果您可以修改Node
的源代码,则让它prepend Enumerable
而不是include Enumerable
。
如果不能,那么您可以从Enumerable
中获取实例方法select
,然后bind
将其抓取到Node
的实例,然后call
IT。
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的话题,"祖先行为"