我非常熟悉 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 枚举的类(class),并在学生测试时遇到了这个例子 map
出去。铲子 (<<
) 运算符的返回值是添加元素后的数组。结果不应该是:
[["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]]
好像是整个循环过程和铲子算子的最终返回值都处理了?给了什么?
最佳答案
在您的例子中,map
的结果是一个数组,该数组由多次引用同一数组 new_empty_array
组成。您不是在创建三个不同的数组,而是在 map
block 中修改同一个数组。
要获得您期望的输出,您需要执行以下操作:
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"]]
关于arrays - 为什么映射可枚举返回值不返回预期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38467713/