在Ruby哈希中忽略重复键的哪个值?

时间:2015-10-05 20:07:31

标签: ruby hash hashmap

如果散列有多个相同的键指向不同的值,那么Ruby如何确定为该键分配了哪个值?

换句话说,

hash = {keyone: 'value1', keytwo: 'value2', keyone: 'value3'}

结果

warning: duplicated key at line 1 ignored: :keyone

但我怎么知道为:keyone分配了哪个值?

4 个答案:

答案 0 :(得分:4)

最后一个会覆盖以前的值。在这种情况下,"value3"成为:keyone的值。这与merge的工作方式相同。当合并具有相同键的两个哈希时,后一个哈希值(不是接收者而是参数)中的值会覆盖另一个值。

答案 1 :(得分:1)

重复键警告上的行号可能会产生误导。正如此处的其他答案所确认的那样,除了为该键定义的最后值之外,忽略重复键的每个值。

跨多行使用问题中的示例:

1 hash1 = {key1: 'value1',
2 key2: 'value2', 
3 key1: 'value3'}
4 puts hash1.to_s

keydup.rb:1: warning: duplicated key at line 3 ignored: :key1
{:key1=>"value3", :key2=>"value2"}

消息显示“第3行被忽略”,但实际上是第1行中定义的键的值被忽略,并且使用了第3行的值,因为这是传入该密钥的最后一个值。

答案 2 :(得分:1)

这在ISO Ruby语言规范的第11.5.5.2节 Hash构造函数中清楚地阐明:

  

11.5.5.2哈希构造函数

     

语义

     

[...]

     

b)2)对于每个关联A i 按照它在程序文本中出现的顺序,请执行以下步骤:< / p>      

i)评估 A i 关联键 operator-expression 。设 K i 为结果值。

     

ii)评估关联值 operator-expression 。设 V i 为结果值。

     

iii)在 H K i V i >通过 K i V i <调用 H 上的方法[]= / em>作为参数。

答案 3 :(得分:0)

IRB是你的朋友。在命令行中尝试以下操作:

irb
hash = {keyone: 'value1', keytwo: 'value2', keyone: 'value3'}
hash[:keyone]

你得到了什么?应该是&#34; value3&#34;。

检查这些东西的最佳方法就是尝试一下。这是Ruby的伟大之处之一。