arrays - 为什么 Ruby 的 each_with_object 会将附加有 += 运算符的数据删除到数组备忘录中?

标签 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 一起使用?

最佳答案

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/

相关文章:

ios - 显示组合数组中的文本标签(使用 API)

c - 如何准备 UDP 数据报发送到服务器

ruby - tcp 客户端无法从 eventmachine 接收数据

java - Java (Android) 中的大型二维数组存储

Javascript 将数据总数放入列表中

ruby - 正则表达式允许在中间使用 A-z、0-9 和破折号,从不在末端使用?

ruby-on-rails - Rails - grouped_collection_select

ruby-on-rails - 我如何/应该在配置/环境中包含 Ruby 项目文件依赖项?

ruby - 在 Ruby 中创建模块变量

arrays - 在 MIPS/Assembler 中将 ASCII 数字字符串转换为 int