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

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

换一种说法,

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

结果是

 warning: duplicated key at line 1 ignored: :keyone 

但我怎么知道分配给哪个值:keyone

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

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

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

 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行的值,因为这是传递给该键的最后一个值。

这在第11.5.5.2节中明确阐述了ISO Ruby语言规范的Hash构造函数

11.5.5.2哈希构造函数

语义

[…]

b)2)对于每个关联A i按照它在程序文本中出现的顺序 ,采取以下步骤:

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

ii)评估关联值运算符表达式 。 设V i为结果值。

iii)通过在K上调用方法[]=K iV i作为参数,将一对K iV i存储H中

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

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

你得到了什么? 应该是“value3”。

检查这些东西的最佳方法就是尝试一下。 这是关于Ruby的好东西之一。