【问题标题】:How can I make a Ruby symbol pointer point to something else instead?我怎样才能让 Ruby 符号指针指向别的东西呢?
【发布时间】:2013-07-16 17:45:41
【问题描述】:

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

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

我可能应该只学习 C。^_^

【问题讨论】:

    标签: ruby pointers tree symbols


    【解决方案1】:

    我认为您对该对象架构的设计是错误的。与其拥有树形结构,不如只用一个散列来代表所有分支。

    例如,假设你有一棵这样的树:

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

    除了保持树形结构外,您还可以像这样拥有单个哈希:

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

    您可以随时轻松地将其扩展为树形结构。而当你想更换其中一个分支时,这很容易。此外,当您在问题中提到的树中有相同的子树时,按照我的建议保持它可以避免冗余。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我认为我的问题的答案基本上是“不”。但如果我真的需要这个功能,我会这样做!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多