2016-07-19 95 views
3

我對Ruby Enumerable模塊非常熟悉,或者至少是這麼想的。看看下面的代碼片段:爲什麼地圖可枚舉的返回值不會返回期望值

names = [ "Donald", "Daisy", "Daffy" ] 

new_empty_array = [] 

new_names_array = names.map do |name| 
    new_empty_array << name 
end 

puts new_names_array.inspect 
# prints [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 

我知道我沒有使用正確map,但我在教學上的Ruby可枚舉的教訓和整個這個例子就是當一名學生被檢測出map。鏟子的返回值(<<)是一個元素添加後的數組。不應該是結果:

[["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]] 

似乎是整個循環過程和鏟運算符的最終返回值處理?是什麼賦予了?

+1

是'first_names'應該是'names'? – squiguy

回答

5

在你的情況下,map的結果是一個數組,其中多次引用相同的數組new_empty_array。您不創建三個不同的數組,但修改map塊中的同一個數組。

爲了得到你所期望的輸出,你需要做的:

new_names_array = first_names.map do |name| 
    (new_empty_array << name).dup 
end 

作爲一個側面說明,您可以使用此代碼,這是比代碼更明顯的上方,用於輸出你的願望:

(1..first_names.size).map do |num| 
    first_names.take(num) 
end 
#=> [["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]] 
+0

讓我直截了當,每次迭代的返回值是'new_empty_array',因爲'.map'的最後一次迭代返回一個包含3個元素的數組,從映射返回的是'new_empty_array',它的最後一個狀態爲3時間 –

+0

@AndrewKim'new_empty_array'是對一個數組的引用,並且你在map中返回對它的引用,因此最終有3個對它的引用作爲數組 - 所有3個引用指向同一個物理數組,在迭代結束時有3個元素 –

0
new_names_array = first_names.map do |name| 
    name 
end 

會給["Donald", "Daisy", "Daffy"]

first_names的每個元素都會向map創建的新陣列返回一個值,但是您將爲每個元素返回一個新陣列new_empty_array

這個對象是<<三次,並在年底有三個名字,所以3×3個要素:

[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 
+0

@錫文,thnx再次爲編輯,你必須投入大量的時間來糾正像我這樣的非說英語的人 – peter

+0

可能你的意思是'非英語寫作人';-) –