我对以下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
?
答案 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。