2017-01-03 40 views
1

如果我使用的每一個do循環填充的陣列,它會留下陣列,因爲它是(在這種情況下,這將是大小爲4的一個零陣列)爲什麼不能用Ruby中的每個do循環填充數組?

array = Array.new(4) 
array.each do |i| 
    i = 5 
end 

我明白可以初始化一個數組與我想要的值使用array = Array.new(4) {desired value},但有些情況下,我在不同的值之間進行選擇,我試圖瞭解每個循環如何正確工作。

我做它目前的方式是填充陣列,使我的理想值

array = Array.new(4) 
array.each_with_index do |val, i| 
    array[i] = 5 
end 
+0

您可以選擇傳入第二個參數來填充數組,例如:array = Array。新(4,5)'這將達到相同的效果。 – DaniG2k

+0

這是另外一個讓人迷惑的例子,他們堅持認爲Ruby是通過引用的。不,它不是!它是通過價值。如果它是通過引用傳遞的,OP的代碼將起作用。我對此爲何如此引起爭議感到茫然。我們可以通過聲稱Ruby是通過引用來停止混淆人們嗎? –

回答

4

解決方案

以下需要:

array = Array.new(4) do |i| 
    5 
    # or some logic depending on i (the index between 0 and 3) 
end 

你的代碼

array = Array.new(4)

數組現在是一個包含4個元素的數組(每次都有nil)。

array.each遍歷這4個元素(仍然是nil),並將i設置爲塊局部變量等於nil

在這個塊內,你用5覆蓋了i,但是你沒有做任何事情。在下一次迭代期間,i被設置回nil5,依此類推......

您不更改原始數組,只更改已設置爲等於數組元素的局部變量。

3

所不同的是

i = 5 

是一個賦值。它將值5分配給變量i

在Ruby,作業隻影響局部範圍,它們沒有在呼叫者的範圍改變變量:

def change(i) 
    i = 5  # <- doesn't work as you might expect 
end 

x = nil 
change(x) 
x #=> nil 

因此,不可能通過分配給一個變量來代替與另一對象的數組元素。

在另一方面,

array[i] = 5 

不是分配,但變相方法調用。這等效於:

array.[]=(i, 5) 

array.public_send(:[]=, i, 5) 

它要求該陣列在索引i的元素設置爲5