2

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

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

我的Node班有#add_child(child). 问题是,当Anode 获得子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)by 可用#add_child(child),那么如果某个随机程序员决定自己调用,我的系统就不会崩溃#set_parent(parent)

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

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

4

2 回答 2

5

这应该有效:

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

你在里面instance_exec就像在另一个对象里面,所以你可以调用私有方法,甚至直接设置实例变量。child.instance_exec(self) { |parent| @parent = parent }也可以。你也可以做child.send(:set_parent, self)or child.instance_variable_set(:parent, self),但我认为instance_exec让你在做什么更清楚。YMMV。:)

Ruby 只是名义上保护了它的类的内部,足以让你不会意外地把自己踢到脚上。但它的自省功能足够强大,您可以根据需要从任何地方访问任何内容。

于 2013-07-11T00:43:43.013 回答
1

还有一个“朋友”宝石,它将这种语言特性添加到 ruby​​:https ://github.com/lsegal/friend

于 2013-11-16T17:49:11.693 回答