gpt4 book ai didi

ruby - 我如何在 Ruby 中模拟类/方法的友谊?

转载 作者:行者123 更新时间:2023-12-02 08:39:54 25 4
gpt4 key购买 nike

我(几乎)记得在 C++ 中,您可以创建能够访问私有(private)成员的友元类或方法。坦率地说,我从未发现该功能特别有用。

现在我正在使用 Ruby 作为游戏开发框架。我正在制作一个简单的节点系统(一个节点可以包含其他子节点,并有一个父节点)。

我的 Node 类有 #add_child(child)。问题是,当 A 节点获得子 B 节点时,我需要设置 B@parent引用指向 A。所以在 #add_child(child) 里面我有这个电话:

child.set_parent(self)

现在 B@parent 变量指向 A。这很好用。

但是,#set_parent(parent) 仅用于此特定场景。必须仅在调用 #add_child(child) 时调用它。如果我在上下文之外使用 #set_parent(parent),节点系统可能会崩溃。

现在我确实发现类/方法友谊有用。如果我可以使 #set_parent(parent) 仅供 #add_child(child) 使用,那么即使某个随机程序员决定调用 #set_parent,我的系统也不会崩溃( parent ) 自己。

从一些搜索结果来看,Ruby 似乎并没有明确地具有这个特性。

Ruby 是否像 C++ 那样提供类/方法友好功能?如果没有,我还能如何解决所描述的问题?

最佳答案

这应该有效:

class Node
def add_child(child)
@children << child # or whatever
child.instance_exec(self) { |parent| set_parent(parent) }
end
end

instance_exec 内部,您就像在另一个对象内部一样,因此您可以调用私有(private)方法,甚至直接设置实例变量。 child.instance_exec(self) { |parent| @parent = parent } 也可以。您也可以执行 child.send(:set_parent, self)child.instance_variable_set(:parent, self),但我认为 instance_exec它更清楚你在做什么。 YMMV。 :)

Ruby 仅在名义上保护其类的内部,足以让您不会不小心搬起石头砸自己的脚。但它的内省(introspection)功能足够强大,您可以根据需要从任何地方访问任何内容。

关于ruby - 我如何在 Ruby 中模拟类/方法的友谊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17583194/

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