我有 2 个类,它们的对象应该充当“伙伴”。第一个是我的 Thing
类,它的实例应该充当 gem RubyTree 的 Tree::TreeNode
。
基本上,这个委托(delegate)可以使用Forwardable
来实现:
class Thing < NoClassInheritancePlease
extend Forwardable
def initialize(title = "node")
@node = Tree::TreeNode.new title
# Collect node methods that should be delegated
node_methods = @node.public_methods(false)
node_methods += @node.protected_methods
node_methods -= (public_methods(false) + protected_methods(false) + private_methods) # own methods should not been delegated
# Set up delegation of specified node methods as singleton methods
for method in node_methods
Base.def_delegator :@node, method
end
end
end
问题:许多 TreeNode
方法都引用了 self
。例如:
def each(&block) # :yields: node
yield self
children { |child| child.each(&block) }
end
因此,my_thing.each {...}
产生 self
,即属于 的 Tree::TreeNode
对象my_thing
但不是 Thing
对象本身。
另一个例子:
siblings = []
parent.children {|my_sibling| siblings << my_sibling if my_sibling != self}
siblings
parent.children 返回一个 Thing
数组,因此条件永远不会计算为 false,因为 my_sibling
是一个 Thing
(这很好) 但 self
是一个 Tree::TreeNode
问题:如何在另一个类(例如Thing)的上下文中评估一个类(例如Tree::TreeNode
)的实例方法
)? (“覆盖 self ”)
我尝试使用 UnboundMethods,但您只能将原始接收类的实例绑定(bind)到未绑定(bind)的方法。
如果你真的想要,you could use evil-ruby解决这个问题。
require 'evil'
class A; def m; self; end; end
class B; end
A.instance_method(:m).force_bind(B.new).call
我是一名优秀的程序员,十分优秀!