我很确定这是不可能的,但它非常诱人。
我正在使用树结构,由哈希内的数组内的哈希组成,等等。层次结构以符号为底部(即,树的叶子都是符号)。我正在编写一种方法,该方法采用其中一棵树并用另一棵树替换特定符号的所有实例(即,它通过用另一棵树替换一些叶子来扩展树)。该符号可能出现在树的许多地方,遍历树可能是一项繁重的操作。Ruby 将符号存储一次,然后将指向它的指针放在叶子上。有什么办法可以通过用另一棵树替换指针位置的符号来利用这个事实?
我可能应该只学习C。^_^
我认为您对该对象架构的设计是错误的。您应该只拥有一个代表所有分支的散列,而不是具有树结构。
例如,假设你有一棵这样的树:
- Homonoidea
- Hylobatidae
- Hylobates
- Hominidae
- Pongo
- Gorilla
- Pan
- Homo
与其保持树结构,不如使用这样的单个散列:
@hash = {
root: [:homonoidea],
homonoidea: [:hylobatidae, :hominidae],
hylobatidae: [:hylobates],
hominidae: [:pongo, :gorilla, :pan, :homo],
}
每当您需要时,很容易将其扩展为树形结构。而当你想更换其中一个分支时,这很容易。此外,当您在问题中提到的树中有相同的子树时,按照我的建议保持它可以避免冗余。
这是我拥有的最好的解决方案,而且非常hacky!在你使用它之前,我会三思而后行。
解释
Ruby 是通过引用传递的,但是许多 Ruby 方法返回对象。这意味着赋值将覆盖对先前对象的引用,而不是覆盖引用的对象。
我们可以通过创建一个我们从不覆盖的包装类来解决这个问题。这样我们可以更改内容并更新多个变量。
class Pointer
attr_accessor :obj
end
a = Pointer.new
a.obj = "foo"
b = a
puts a.obj
puts b.obj
puts "Updating"
a.obj = "bar"
puts a.obj
puts b.obj
输出
foo
foo
Updating
bar
bar