1

まだルビーの基礎を学んでいるので、九九を作ってみようと思いました

x = (0..7).to_a
y = []
x.each { y << x }

yこれで、各行が等しい8x8配列になります。これらは私が望まない単なるプレースホルダー値なので、値を変更するために配列インデックスを反復処理しようとします。

x.each { |i| y[i][i] = i * i }

この時点で、yは8列の。を含む配列になります[0, 1, 4, 9, 16, ...]y[1][3]なぜ二乗された値しか受け取らないのかは理解できますが、たとえば、などのインデックスの値のみが変更されることを期待しているのに、[1][1]なぜ変更されるのかはまったくわかりません[2][2]

さらに、意図的に値を再割り当てしたことはありませんが、の値もx再割り当てされます。[0, 1, 4, 9, 16, ...]上記のコード部分により、その値が自動的に再割り当てされ、その理由がわかりません。

xこのようなテーブルを自分で作成する別の方法をいつでも調べることができますが、その結果、値が変更される原因と、インデックスの反復が期待どおりに動作しない理由を理解したいと思います。2D配列の各インデックスをより適切に反復することに移ります。これは、単純な試みで無効な出力が生成される理由を理解できる場合です。このかなり基本的なタスクを自分で理解したいのですが、今のところ障害になっています。

4

1 に答える 1

5

入力したのは、まったく同じオブジェクトyへの8つの参照です。したがって、を変更すると、それは、と同じものになり、などと同じになります。 xy[1][1]x[1]y[2][1]y[3][1]

の値はx再割り当てされていません。むしろ、x8要素の配列です。このオブジェクトはy8倍の要素であり、 x;の値でもあります。の各反復は、eachその配列の内容を変更しています。

あなたがそれに慣れていない場合、これはかなり直感に反します。おそらく、次の恐ろしい例えが役立つでしょう。あなたが秘密結社を始めたばかりで、現時点であなたが唯一のメンバーであるとしましょう。(それは非常に秘密結社です。)特に:あなたは社会の会長であり、その秘書であり、その会計係です。あなたにも仕事があります。あなたは、たとえば、マイクロソフトのCEOです。

さて、ライバルの秘密結社のメンバーがやって来て、あなたの秘密結社の社長の左足を壊します。(どうやらそれは十分に秘密ではなかったようです。)別の人が来て、秘書の右膝蓋骨を壊します。別の人は会計係の歯を壊します。そして今、見よ、マイクロソフトのCEOはこれらすべての憤慨に苦しんでいることがわかった。どうしてそれができるのでしょうか?マイクロソフトのCEOの膝蓋骨を壊すように誰にも言わなかった!

もちろん、これについて難しいことは何もありません。まったく同じ人がこれらすべての役割を果たすことができます。Mangrove-Throat-Wobbler Societyの会長を、その秘書を依頼する場合と同じように依頼した場合、またはMicrosoftのCEOを依頼した場合は、まったく同じ人物になります。

Ruby(およびそのような他の多くの言語)では、変数とその値の間の関係、または配列内の位置とそこに保持されているものとの関係は、たとえば、ボックスとその中身の関係。まったく同じ人物が大統領兼秘書兼会計およびGrandPooh-Bahになることができるのと同じように、まったく同じことが多くの変数の値になる可能性があります。

于 2012-06-14T23:32:04.487 に答える