代码如下: 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 = Hash.new([])
hsh["a"] << 1
hsh["b"] << 2
p hsh
hsh = {"a"=>[1], "b"=>[2]}
你想要的结果应该是:hsh["c"] = 1
new 的参数是表示默认值,就是没有 key 的时候,返回默认值,也就是你给的数组参数。
#1 楼 @realwol 我知道您这样做是对的,但是我还想明白为什么帖子上那样做是错误的。
你这么写,每个默认值都引用了同一个数组,而且访问到默认值不改变 hash (你想想 h = {}; h['a'] 这个代码里,h 会不会变化?). 你应该这么写:
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
明白了,谢谢楼上诸位~