如何在Ruby中模拟类/方法友谊?

Vol*_*ort 2 ruby methods friend

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

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

我的Node班级有#add_child(child).问题是,当A节点得到一个子B节点,我需要设置B@parent参考指向A.所以#add_child(child)我有这个电话:

child.set_parent(self)
Run Code Online (Sandbox Code Playgroud)

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

但是,#set_parent(parent) 仅用于此特定方案.它必须仅在被调用时#add_child(child)被调用.如果我#set_parent(parent)在上下文之外使用,节点系统可能会中断.

现在我发现类/方法友情的东西很有用.如果我#set_parent(parent)只能使用#add_child(child),我的系统不会破坏,如果一些随机程序员决定自己调用#set_parent(parent).

从一些搜索来看,Ruby似乎没有明确地具有此功能.

Ruby提供像C++这样的类/方法友好功能吗?如果没有,我还能如何处理上述问题呢?

Ama*_*dan 5

这应该工作:

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

在里面instance_exec你好像在另一个对象里面,所以你可以调用私有方法,甚至直接设置实例变量.child.instance_exec(self) { |parent| @parent = parent }会工作的.你也可以做child.send(:set_parent, self)child.instance_variable_set(:parent, self),但我想instance_exec使它更清楚一点,你在做什么.因人而异.:)

Ruby只是名义上保护了它的类的内部,足以让你不会意外地射击自己.但它的内省功能非常强大,如果你愿意,你可以从任何地方访问任何东西.