arrays - 为什么映射可枚举返回值不返回预期值

标签 arrays ruby enumerable

我非常熟悉 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/

相关文章:

arrays - 如何从数组中删除与另一个数组中的元素匹配的元素

c# - Linq/Enumerable Any Vs 包含

c# - 如何创建具有 n 个字节的数组?

c# - 可枚举范围降序排列

ruby - 如何在 Ruby 中创建百分比方法,如 %w 或 %x?

ruby - 在 Ruby 哈希中查找保留重复项

arrays - 在模板文件中创建数组和循环的最佳方法是什么

PHP 多维数组到平面文件夹 View

ruby-on-rails - 如何在 RoR 中为模型添加额外的临时参数?

ruby - 获取数组的拒绝计数