在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 i和V i作为参数,将一对K i和V i存储在H中 。
IRB是你的朋友。 在命令行中尝试以下操作:
irb hash = {keyone: 'value1', keytwo: 'value2', keyone: 'value3'} hash[:keyone]
你得到了什么? 应该是“value3”。
检查这些东西的最佳方法就是尝试一下。 这是关于Ruby的好东西之一。