如果散列有多个相同的键指向不同的值,那么Ruby如何确定为该键分配了哪个值?
换句话说,
hash = {keyone: 'value1', keytwo: 'value2', keyone: 'value3'}
结果
warning: duplicated key at line 1 ignored: :keyone
但我怎么知道为:keyone
分配了哪个值?
答案 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的伟大之处之一。