`hash = {}.inject{|h,k| h[k] = 你为什么这样做?}`

2026-04-10 06:511阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计586个文字,预计阅读时间需要3分钟。

`hash = {}.inject{|h,k| h[k] = 你为什么这样做?}`

我正在尝试编写哈希列表中为哈希键指定所有值的程序。我的工作如下:使用以下数据,将每个哈希键的值注入到空哈希中。[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]。代码如下:

ruby[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}].inject({}) do |hash, item| item.each do |key, value| hash[key]=[] unless hash[key] hash[key] <

`hash = {}.inject{|h,k| h[k] = 你为什么这样做?}`

我正在尝试编译哈希列表中给定哈希键的所有值.我有以下工作.

[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}].inject({}) do |hash, item| item.each do |key, value| hash[key] = [] if hash[key].nil? hash[key] << value end hash end

这是伟大的结果:

{:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

我的问题:是否有更优雅的方式来初始化哈希,所以我不需要检查以下行中的nil情况?

hash[key] = [] if hash[key].nil?

我已经尝试将Hash.new(0)作为inject方法的默认值,但它不起作用.我确信有更优雅的方式来做到这一点.谢谢.

解决方案

你可以使用each_with_object:

array = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}] empty_hash = Hash.new{ |h, k| h[k] = [] } hash = array.each_with_object(empty_hash) do |small_hash, hash| small_hash.each do |k, v| hash[k] << v end end p hash #=> {:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

这里有一个更短但更不寻常的版本:

hash = array.each_with_object(Hash.new{ [] }) do |small_hash, hash| small_hash.each {|k, v| hash[k] <<= v } end p hash #=> {:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

对于[{a:1},{b:2}],返回{:a => [1],:b => [2]},作为指定的OP.

<< =? hash [k]<< = v是一种奇怪的(也可能是低效的)技巧.它相当于:

hash[k] = (hash[k] << v)

需要进行赋值,因为哈希默认值尚未正确初始化,并且正在为每个哈希查找生成一个新数组,而不保存为值:

h = Hash.new{ [] } p h[:a] << 1 #=> [1] p h[:a] #=> [] p h[:a] <<= 1 #=> [1] p h[:a] #=> [1]

本文共计586个文字,预计阅读时间需要3分钟。

`hash = {}.inject{|h,k| h[k] = 你为什么这样做?}`

我正在尝试编写哈希列表中为哈希键指定所有值的程序。我的工作如下:使用以下数据,将每个哈希键的值注入到空哈希中。[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}]。代码如下:

ruby[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}].inject({}) do |hash, item| item.each do |key, value| hash[key]=[] unless hash[key] hash[key] <

`hash = {}.inject{|h,k| h[k] = 你为什么这样做?}`

我正在尝试编译哈希列表中给定哈希键的所有值.我有以下工作.

[{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}].inject({}) do |hash, item| item.each do |key, value| hash[key] = [] if hash[key].nil? hash[key] << value end hash end

这是伟大的结果:

{:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

我的问题:是否有更优雅的方式来初始化哈希,所以我不需要检查以下行中的nil情况?

hash[key] = [] if hash[key].nil?

我已经尝试将Hash.new(0)作为inject方法的默认值,但它不起作用.我确信有更优雅的方式来做到这一点.谢谢.

解决方案

你可以使用each_with_object:

array = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}, {'a': 7, 'b': 8, 'c': 9}] empty_hash = Hash.new{ |h, k| h[k] = [] } hash = array.each_with_object(empty_hash) do |small_hash, hash| small_hash.each do |k, v| hash[k] << v end end p hash #=> {:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

这里有一个更短但更不寻常的版本:

hash = array.each_with_object(Hash.new{ [] }) do |small_hash, hash| small_hash.each {|k, v| hash[k] <<= v } end p hash #=> {:a=>[1, 4, 7], :b=>[2, 5, 8], :c=>[3, 6, 9]}

对于[{a:1},{b:2}],返回{:a => [1],:b => [2]},作为指定的OP.

<< =? hash [k]<< = v是一种奇怪的(也可能是低效的)技巧.它相当于:

hash[k] = (hash[k] << v)

需要进行赋值,因为哈希默认值尚未正确初始化,并且正在为每个哈希查找生成一个新数组,而不保存为值:

h = Hash.new{ [] } p h[:a] << 1 #=> [1] p h[:a] #=> [] p h[:a] <<= 1 #=> [1] p h[:a] #=> [1]