【问题标题】:Why does map enumerable return value not return expected value为什么map可枚举返回值不返回期望值
【发布时间】:2016-11-22 21:22:24
【问题描述】:

我对 Ruby Enumerable 模块非常熟悉,至少我是这么认为的。取如下代码sn -p:

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 时遇到了这个示例。铲子 (&lt;&lt;) 运算符的返回值是添加元素后的数组。结果不应该是:

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

好像整个循环都处理完了,铲子算子最后的返回值都处理完了?什么给了?

【问题讨论】:

  • first_names 应该是 names 吗?

标签: arrays ruby enumerable


【解决方案1】:

在您的情况下,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"]]

【讨论】:

  • 让我直截了当地说,每次迭代的返回值是 new_empty_array 并且因为 .map 的最后一次迭代返回一个包含 3 个元素的数组,所以从地图返回的是 @987654328 @ 处于最后状态 3 次
  • @AndrewKim new_empty_array 是对数组的引用,并且您在 map 中返回对它的引用,因此,最终以数组的形式引用它的 3 个引用 - 所有 3 个引用都指向同一个物理数组,它位于迭代结束有 3 个元素
【解决方案2】:
new_names_array = first_names.map do |name|
  name
end

会给["Donald", "Daisy", "Daffy"]

first_names 的每个元素都向map 创建的新数组返回一个值,但您为每个元素返回一个新数组new_empty_array

这个对象是&lt;&lt; 的三次,最后是三个名称,所以是 3 x 3 个元素:

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

【讨论】:

  • @the Tin Man,再次感谢编辑,您必须投入大量时间来纠正像我这样不会说英语的人
  • 你的意思可能是non english writing people ;-)
猜你喜欢
  • 1970-01-01
  • 2012-06-04
  • 2014-02-15
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多