如何让Ruby符号指针指向其他东西呢?

时间:2013-07-16 17:45:42

标签: ruby pointers tree symbols

我很确定这是不可能的,但它非常诱人。

我正在使用树形结构,由哈希中的数组中的哈希组成,等等。层次结构以符号结束(即,树的叶子都是符号)。我正在编写一个方法,它接受其中一个树并用另一个树替换特定符号的所有实例(即,它通过用另一个树替换一些叶子来扩展树)。符号可以出现在整个树的许多地方,遍历树可能是一个繁重的操作。 Ruby存储一次符号,然后只在叶子上放置指针。有没有什么方法可以通过用另一棵树替换指针位置的符号来利用这个事实?

我应该学习C. ^ _ ^

2 个答案:

答案 0 :(得分:2)

我认为你对该对象架构的设计是错误的。不应该有树结构,而应该只有一个表示所有分支的哈希。

例如,假设您有一个这样的树:

- Homonoidea
  - Hylobatidae
    - Hylobates
  - Hominidae
    - Pongo
    - Gorilla
    - Pan
    - Homo

不是保留树结构,而是可以像这样使用单个哈希:

@hash = {
  root: [:homonoidea],
  homonoidea: [:hylobatidae, :hominidae],
  hylobatidae: [:hylobates],
  hominidae: [:pongo, :gorilla, :pan, :homo],
}

无论何时需要,都可以轻松地将其扩展为树形结构。当你想要替换其中一个分支时,很容易。此外,当您在问题中提到的树中具有相同的子树时,按照我的建议保留它将避免冗余。

答案 1 :(得分:0)

这是我拥有的最佳解决方案,而且非常 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