1

誰かがここで何が起こっているのか教えてくれます:

a = [0,1,2]
a.each {|x| a[x] = a}

結果は[[...], [...], [...]]です。そして、私が評価すると、a[0]私は得[[...], [...], [...]]ます。そして、私が評価すると、私は無限a[0][0]になります。[[...], [...], [...]]

無限の次元の配列を作成しましたか?これはどのように/なぜ機能する必要がありますか?

4

2 に答える 2

3

a基本的に、リスト自体を参照するようにすべての要素を変更しました。リストは自分自身を再帰的に参照しています:

a[0] # => a
a[0][0] # => a[0], which is a
a[0][0][0] # => a[0][0], which is a[0], which is a
...

(# =>は「この行が次のように評価される」ための Rubyism です)

見方によっては無限ではありません。両面に「裏返してください」と書かれた紙のようなものです。

Ruby[...]が表示する理由は、リストが再帰的であることを発見し、無限ループに入るのを回避するのに十分賢いからです。

ところで、あなたの の使い方eachは少し慣用的ではありません。eachリストを返します。通常、この戻り値を変数に割り当てません (aこの場合、既に変数を参照しているため)。つまり、コードは に代入[0,1,2]a、ループしてa(各要素を に設定a)、 に代入aaます。

于 2011-01-17T19:38:57.477 に答える
1

自己参照型のデータ構造だと思います。a [x] = aは、aのポインタをa[x]に置きます。

于 2011-01-17T19:31:49.147 に答える