为什么Ruby的each_with_object会将附加了+ =运算符的数据丢弃到数组备忘录中?

时间:2016-03-13 16:05:11

标签: arrays ruby

我对以下Ruby行为感到困惑:

result = [1,2,3].each_with_object([]) do |elem, memo|
  memo << [elem]
end
puts result.to_s
# => [[1], [2], [3]]

上面的代码可以解释我希望它如何工作。但是,下面的代码似乎只是删除了我想要附加到数组的数字。

result = [1,2,3].each_with_object([]) do |elem, memo|
  memo += [elem]
end
puts result.to_s
# => []

有人可以向我解释这里发生了什么,以及我应该如何在上述背景下使用+=运算符和each_with_object

2 个答案:

答案 0 :(得分:3)

memo是局部变量,指向数组对象。这些循环变量在每次迭代时设置。

在第一个示例中,您更改了此数组对象。

在第二个示例中,使用新数组覆盖局部变量。因为memo += [elem]只是memo = momo + [elem]的简写 旧数组保持空白。

通常,您最好使用inject代替each_with_object。使用inject时,新的memo变量会根据块的结果进行设置,因此您可以使用非破坏性函数。

[1,2,3].inject([]) do |memo, elem| 
  memo + [elem]
end

答案 1 :(得分:2)

根据文档,https://maps.googleapis.com/maps/api/place/textsearch/json?query=someplacename&key=key - 连接 - 返回通过将两个数组连接在一起以生成第三个数组而构建的新数组。

因此,在每次迭代时,块结果都设置为一个新数组,然后重置回在下一次迭代中传递给+=方法的空数组。请考虑以下demonstration