我将粘贴一个我尝试过的简单示例,以便那些阅读此内容的人会清楚.
irb(main):001:0> h = { }
=> {}
irb(main):002:0> a=[1,2,3]
=> [1, 2, 3]
irb(main):003:0> a.object_id
=> 69922343540500
irb(main):004:0> h[a] = 12 #Hash with the array as a key
=> 12
irb(main):005:0> a << 4 #Modified the array
=> [1, 2, 3, 4]
irb(main):006:0> a.object_id #Object id obviously remains the same.
=> 69922343540500
irb(main):007:0> h[a] #Hash with the same object_id now returns nil.
=> nil
irb(main):008:0> h #Modified hash
=> {[1, 2, 3, 4]=>12}
irb(main):009:0> h[[1,2,3,4]] #Tried to access the value with the modified key -
=> nil
irb(main):011:0> h.each { |key,value| puts "#{key.inspect} maps #{value}" }
[1, 2, 3, 4] maps 12
=> {[1, 2, 3, 4]=>12}
Run Code Online (Sandbox Code Playgroud)
现在,当我遍历哈希时,可以识别密钥和值之间的映射.
有人可以解释一下ruby hash的这种行为以及散列键的属性是什么.
1)正如我上面提到的,object_id没有改变 - 那么为什么值设置为nil.
2)是否有任何可能的方法,以便我可以从散列'h'返回值'12',因为上面提到的h [[1,2,3,4]]返回nil.
发生这种情况是因为密钥在使用时不应更改其值.如果值发生变化,我们应该根据其当前值重建哈希值.查看Ruby API的rehash方法.您可以通过在更改密钥后重新重新生成哈希来获取值,如下所示:
irb(main):022:0> h.rehash
=> {[1, 2, 3, 4]=>12}
irb(main):023:0> h[a]
=> 12
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1144 次 |
| 最近记录: |