我正在try 初始化数组的散列,例如

@my_hash = Hash.new(Array.new)

这样我就可以:

@my_hash["hello"].push("in the street")
=> ["in the street"]
@my_hash["hello"].push("at home")
=> ["in the street", "at home"]
@my_hash["hello"]
=>["in the street", "at home"]

问题是,任何新的哈希键也会返回["in the street", "at home"]

@my_hash["bye"]
=> ["in the street", "at home"]
@my_hash["xxx"]
=> ["in the street", "at home"]

!!!???

我做错了什么初始化数组散列的正确方法是什么?

推荐答案

@my_hash = Hash.new(Array.new)

这只会创建一个数组对象,每次找不到密钥时都会返回该对象.由于您只会对该数组进行变异,而不会创建新的数组,因此所有键都会映射到同一个array.

你想做的是:

@my_hash = Hash.new {|h,k| h[k] = Array.new }

或者干脆

@my_hash = Hash.new {|h,k| h[k] = [] }

将块传递给Hash.new与简单地传递参数有两种不同:

  1. 每次找不到密钥时都会执行该块.因此,每次都会得到一个新array.在带有参数的版本中,该参数会计算一次(在调用new之前),每次都会返回结果.

  2. 通过执行h[k] =,实际上是将密钥插入哈希.如果不这样做,访问@my_hash[some_key]实际上不会导致some_key被插入哈希中.

Ruby相关问答推荐

有没有办法保存 ruby​​ 代码的执行,以便稍后使用逐步重播对其进行调试?

Ruby:程序终止后仅写入/保存/可见的文件数据

.nil?、.blank? 之间的区别?和.empty?

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

当没有传入块时,是否有更好的方法来防止屈服?

Faraday中的timeout和open timeout是什么?

如何正确截断表格?

GET 和 POST 请求的相同 Rails 4 路由

C# ?? Ruby 中的运算符?

如何从最后一个元素开始遍历数组?

在 jekyll 博客中支持标签的简单方法

git,Heroku:预接收挂钩被拒绝

如何获取符号链接的目标?

Ruby:更新哈希值的最简单方法是什么?

为什么 Ruby 的 Date 类会自动加载,但 DateTime 不会?

Ruby:将字符串转换为日期

测试变量是否等于两个值之一

如何在 Ruby 中取消定义类?

Ruby 疯狂:类与对象?

Ruby 的 %q / %Q 引用方法的用例是什么?