哈希值不存在时,为什么不会抛出异常?
问题描述:
我正在学习Ruby语言,在编写简单的打印操作时,我看到了一件奇怪的事情。代码如下:哈希值不存在时,为什么不会抛出异常?
z = { 'mike' => 75, 'bill' => 18, 'alice' => 32 }
print z['bill'], " ", z['joe'], " "\n"
这里我得到输出为18
;即使joe
没有可用的值,它也不会引发任何错误。
这是为什么?在其他语言如c#
它会抛出异常!
是因为我使用在线编译器编译它吗?
答
当在Hash
中找不到散列键时,默认情况下,方法[]
将返回nil
。因此在z['joe']
的情况下将导致nil
,当打印结果为空字符串时。另一方面,当你初始化散列时,你可以定义一个代码块,当密钥不存在于散列中时,它将被运行。例如:
z = Hash.new do |hash, key|
raise("Key #{ key } is not valid")
end
作为替代也可以使用Hash#fetch
并让它失败KeyError
,或指定一个缺省值或者代码块(在new
等)被执行时,该键不退出。
答
此文档中被明确记载的方法Hash#[]
:
hsh[key]
→value
元素参考-检索对应于该键对象的值对象。如果未找到,则返回默认值(有关详细信息,请参阅
Hash::new
)。h = { "a" => 100, "b" => 200 } h["a"] #=> 100 h["c"] #=> nil
的代码示例中的最后一行甚至可以显示你的确切情况。
那么,为什么不是raise
和Exception
?那么,因为访问字典中不存在的密钥并不是一种特殊情况!
另外,它的琐碎与default_proc
是raise
SA KeyError
初始化Hash
:现在
z = { 'mike' => 75, 'bill' => 18, 'alice' => 32 }
z.default_proc = -> (h, k) { raise KeyError, "#{k} not found!" }
z['joe']
# KeyError: joe not found!
,如果有没有指定一个默认值的方式,而是你总是会得到一个例外,反过来实施它将会困难得多。
http://ruby-doc.org/core-2.2.2/Hash.html#method-i-5B-5D – iamnotmaynard
它不会抛出异常,因为这不是Ruby处理它的方式。 – iamnotmaynard