我对以下 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
一起使用?
最佳答案
memo 是局部变量,指向一个数组对象。这些循环变量在每次迭代时设置。
在第一个示例中,您更改了这个数组对象。
在第二个示例中,您使用新数组覆盖局部变量。因为 memo += [elem]
只是 memo = momo + [elem]
的简写
旧数组保持为空。
很多时候你最好使用inject
而不是each_with_object
。使用 inject,新的 memo 变量设置为 block 的结果,因此您可以使用非破坏性函数。
[1,2,3].inject([]) do |memo, elem|
memo + [elem]
end
关于arrays - 为什么 Ruby 的 each_with_object 会将附加有 += 运算符的数据删除到数组备忘录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35972499/