ruby - 向 Hash.new([]) 注入(inject)元素时 << 和 += 有什么区别?

标签 ruby arrays hash

<分区>

这段代码:

[{:id => 1,:key => 3},{:id => 2,:key => 4},{:id => 3, :key => 5}].
     inject(Hash.new([])){|h,i| h[i[:key]] << i; h}

返回:

{}

同时:

[{:id => 1,:key => 3},{:id => 2,:key => 4},{:id => 3, :key => 5}].
     inject(Hash.new([])){|h,i| h[i[:key]] += [i]; h}

返回:

{3=>[{:id=>1, :key=>3}, {:id=>3, :key=>3}], 4=>[{:id=>2, :key=>4}]}

为什么第一个案例的工作方式不同?

最佳答案

在您的第一个示例中,您正在修改作为散列默认值返回的数组,但该数组未定义为散列值,因此被丢弃。

在您的第二个示例中,您正在修改默认数组并通过方法 Hash#[]= 将结果作为值分配给散列。请注意,foo += barfoo = foo + bar 的语法糖,这意味着 hash[foo] += bar 是相同的作为 hash[foo] = hash[foo] + bar

关于ruby - 向 Hash.new([]) 注入(inject)元素时 << 和 += 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14870679/

相关文章:

python - Pipfile哈希创建

c# - 使用 C# 保护用户密码 - Rfc2898DeriveBytes 与 SHA512

ruby - 为什么这种命令式风格比这种函数式风格更快?

python - 使用 Lisp/Scheme 作为脚本语言是否可行?

c++ - 指针和结构数组

javascript - 为什么数组将一个空数组插入另一个数组?

统计每个单词出现的次数

perl - 如何序列化和反序列化发送到套接字的哈希值?

ruby-on-rails - Rails 在 html 文件中渲染带有空格的字符串

html - Notepad++ 中用于 html.erb 文件的颜色编码语法