gpt4 book ai didi

ruby - 如何在当前上下文中评估另一个类的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:06 29 4
gpt4 key购买 nike

我有 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

关于ruby - 如何在当前上下文中评估另一个类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3415233/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com