誰かがここで何が起こっているのか教えてくれます:
a = [0,1,2]
a.each {|x| a[x] = a}
結果は[[...], [...], [...]]
です。そして、私が評価すると、a[0]
私は得[[...], [...], [...]]
ます。そして、私が評価すると、私は無限a[0][0]
になります。[[...], [...], [...]]
無限の次元の配列を作成しましたか?これはどのように/なぜ機能する必要がありますか?
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
)、 に代入a
しa
ます。
自己参照型のデータ構造だと思います。a [x] = aは、aのポインタをa[x]に置きます。