2

これは不可能だと確信していますが、非常に魅力的です。

私は、ハッシュ内の配列内のハッシュなどで構成されるツリー構造を扱っています。階層はシンボルで底をつきます (つまり、ツリーの葉はすべてシンボルです)。これらのツリーの 1 つを取り、特定のシンボルのすべてのインスタンスを別のツリーに置き換えるメソッドを作成しています (つまり、いくつかの葉を別のツリーに置き換えてツリーを拡張します)。シンボルはツリー全体の多くの場所に表示される可能性があり、ツリーをトラバースするのは重い操作になる可能性があります。Ruby は一度シンボルを格納し、それへのポインタを葉に置くだけです。ポインターの位置にあるシンボルを他のツリーに置き換えることで、この事実を利用する方法はありますか?

私はおそらくCを学ぶべきです。^_^

4

2 に答える 2

2

そのオブジェクトのアーキテクチャの設計が間違っていると思います。ツリー構造を持つのではなく、すべての分岐を表す単一のハッシュを持つべきです。

たとえば、次のようなツリーがあるとします。

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

ツリー構造を維持するのではなく、次のような単一のハッシュを持つことができます。

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

必要なときにいつでもツリー構造に展開するのは簡単です。また、分岐の 1 つを交換する場合も簡単です。また、質問で述べたようにツリー内に同一のサブツリーがある場合、私が提案するようにそれを維持すると冗長性が回避されます。

于 2013-07-16T18:05:40.170 に答える
0

これは私が持っている最良の解決策であり、非常にハックです! これを使用する前に、よく考えてください。

説明

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
于 2013-07-16T18:04:51.917 に答える