我对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"]]
似乎整个循环过程和铲运算符的最终返回值都被处理了?是什么给了什么?
答案 0 :(得分: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"]]
答案 1 :(得分:0)
new_names_array = first_names.map do |name|
name
end
会给["Donald", "Daisy", "Daffy"]
。
first_names
的每个元素都会向map
创建的新数组返回一个值,而是为每个元素返回一个新数组new_empty_array
。
这个对象是<<
三次,最后有三个名字,所以3 x 3个元素:
[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]]