在继承的方法上使用 mixin 方法
Use mixin method over inherited one
假设我创建了以下 class:
class Node < Struct.new(:data, :left, :right)
def each(&block)
...
end
end
如您所知,select
由 Struct
和 Enumerable
定义(后者包含在 Struct
中)。
如何 Node.new.select
触发 Enumerable
的实现而不是 Struct
的实现?我需要这个的原因是我已经为我的 class 实现了自定义 each
并且我希望 select
使用它(因此我需要 Enumerable#select
)。
如果你能修改Node
的源代码,那就让它prepend Enumerable
代替include Enumerable
。
如果不行,那你可以从Enumerable
抓取实例方法select
,bind
到Node
的实例,然后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
的话题
假设我创建了以下 class:
class Node < Struct.new(:data, :left, :right)
def each(&block)
...
end
end
如您所知,select
由 Struct
和 Enumerable
定义(后者包含在 Struct
中)。
如何 Node.new.select
触发 Enumerable
的实现而不是 Struct
的实现?我需要这个的原因是我已经为我的 class 实现了自定义 each
并且我希望 select
使用它(因此我需要 Enumerable#select
)。
如果你能修改Node
的源代码,那就让它prepend Enumerable
代替include Enumerable
。
如果不行,那你可以从Enumerable
抓取实例方法select
,bind
到Node
的实例,然后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
的话题