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++这样的类/方法友好功能吗?如果没有,我还能如何处理上述问题呢?
这应该工作:
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只是名义上保护了它的类的内部,足以让你不会意外地射击自己.但它的内省功能非常强大,如果你愿意,你可以从任何地方访问任何东西.
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |