2016-07-19 98 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

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