2012-06-14 43 views
1

我還在學習Ruby的基礎知識,所以我想我會嘗試做一個乘法表變量值無意中

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

y現在是一個8x8的陣列,其中每一行都是平等的。這些只是我不想要的佔位符值,所以我嘗試遍歷數組索引以更改值。

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

此時,y成爲包含的[0, 1, 4, 9, 16, ...] 8列的陣列。我明白爲什麼我只接收平方值,但我不明白爲什麼y[1][3],例如,完全改變,當我只期望在指數,如[1][1],[2][2]值改變。

而且,x的值也重新分配爲[0, 1, 4, 9, 16, ...],即使我從未故意重新分配其值。通過上面的代碼部分,它的值會自動重新分配,我不明白爲什麼。

我總是可以自己查找另一種製作這種表格的方法,但我想了解x導致它改變其值的原因,以及爲什麼通過索引的迭代不像預期那樣工作。我會繼續在2D數組的每個索引上進行更恰當的迭代,以便我能更好地理解爲什麼我的簡單嘗試會產生無效的輸出。我想自己解決這個相當基本的任務,但現在我已經遇到了障礙。

回答

5

你放什麼在y是8個引用完全相同的對象x。因此,當您更改y[1][1]時,與x[1]相同,與y[2][1]y[3][1]等同。

x的值未被重新分配。相反,x是一個8元素陣列;此對象是y八次的元素以及x的值; each的每次迭代都在修改該數組的內容。

如果你不習慣它,這是非常違反直覺的。也許以下可怕的比喻會有所幫助。假設你剛剛成立了一個祕密社團,而目前你是唯一的成員。 (這是一個祕密社會的非常)。特別是:你是這個社會的總統,祕書和財務主管。你也有工作;假設您是微軟的首席執行官。

現在,一個競爭對手的祕密社團的成員來,並打破你的祕密社會總統的左腳趾。 (顯然它不夠祕密。)另一個來打破祕書的右膝蓋。另一個搗毀財務主管的牙齒。而現在,事實證明,微軟的首席執行官已經遭受了所有這些侮辱。怎麼可能?沒有人告訴任何人打破微軟首席執行官的帽子!

當然,這沒有什麼困難:同一個人可以填補所有這些角色;如果你向紅樹林 - 嗓子搖擺社團的主席請求,就好像你要求他的祕書一樣,或者你要求微軟的首席執行官,你也會得到完全一樣的人。

在Ruby(以及許多其他類似的語言)中,變量與其值之間的關係,或者數組中的位置與所持有的東西之間的關係,更像是官方帖子與其持有者之間的關係例如,像盒子和其內容之間的關係。同樣的事情可以是許多變量的價值,就像同一個人可以擔任總統和祕書兼財務主管和大維尼。巴一樣。

+0

謝謝。這是有道理的。我會嘗試一種新方法。 – ac7v

+0

爲該示例投票。好的。 – Anil