Ruby 请教一个关于 Hash 的问题

galo · 2015年02月05日 · 最后由 galo 回复于 2015年02月05日 · 1787 次阅读

代码如下: hsh = Hash.new([]) hsh["a"] << 1 hsh["b"] << 2 p hsh 我想得到的是 hsh = {"a"=>[1], "b"=>[2]} 但是实际上 hsh 还是空的 更奇怪的是,这时候 hsh["a"] 和 hsh["b"] 的值都是 [1, 2] 似乎此时 hsh 的默认值变成了 [1,2] 百思不得其解,请大神指点。

你想要的结果应该是:hsh["c"] = 1

new 的参数是表示默认值,就是没有 key 的时候,返回默认值,也就是你给的数组参数。

#1 楼 @realwol 我知道您这样做是对的,但是我还想明白为什么帖子上那样做是错误的。

你这么写,每个默认值都引用了同一个数组,而且访问到默认值不改变 hash (你想想 h = {}; h['a'] 这个代码里,h 会不会变化?). 你应该这么写:

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

#2 楼 @chenge 明白了,hsh["a"] 返回的是 hsh 默认值,第二行实际上是把 hsh 的默认值修改成了 [1],后边的也是类似。 多谢!

#4 楼 @luikore 原来还可以这样初始化 hash,受教了。

#3 楼 @galo 我觉得你的问题有点钻牛角尖。我尝试解开你的心结。 1,如果你知道这样做是对的,为什么不用对的方式去实现你想要的结果。因为你的写法本来就不是要实现你想要的功能的,可能没有什么原因,就是因为方法名字就是这样,而你以为他可以,其实他不行吧,哈哈。 你可以查看这里,你的想法实际上是给 hash 设置默认值。

[13] pry(main)> hsh= {}
=> {}
[14] pry(main)> hsh['a']
=> nil
[15] pry(main)> hsh['a'].class
=> NilClass
[16] pry(main)> hsh['a'] << "1"
NoMethodError: undefined method `<<' for nil:NilClass
from (pry):16:in `__pry__'

[21] pry(main)> a = []
=> []
[22] pry(main)> hsh= Hash.new(a)
=> {}
[23] pry(main)> hsh['a']
=> []
[24] pry(main)> hsh['a'] << 1
=> [1]
[25] pry(main)> a
=> [1]
[26] pry(main)> hsh['b'] << 2
=> [1, 2]
[27] pry(main)> a
=> [1, 2]
[28] pry(main)>

这样看你就明白为什么了,其实你上面的操作把值最给了 a

明白了,谢谢楼上诸位~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号