2015-05-29 109 views
2

我正在学习Ruby语言,在编写简单的打印操作时,我看到了一件奇怪的事情。代码如下:哈希值不存在时,为什么不会抛出异常?

z = { 'mike' => 75, 'bill' => 18, 'alice' => 32 } 

print z['bill'], " ", z['joe'], " "\n" 

这里我得到输出为18;即使joe没有可用的值,它也不会引发任何错误。

这是为什么?在其他语言如c#它会抛出异常!

是因为我使用在线编译器编译它吗?

+1

http://ruby-doc.org/core-2.2.2/Hash.html#method-i-5B-5D – iamnotmaynard

+2

它不会抛出异常,因为这不是Ruby处理它的方式。 – iamnotmaynard

回答

6

当在Hash中找不到散列键时,默认情况下,方法[]将返回nil。因此在z['joe']的情况下将导致nil,当打印结果为空字符串时。另一方面,当你初始化散列时,你可以定义一个代码块,当密钥不存在于散列中时,它将被运行。例如:

z = Hash.new do |hash, key| 
    raise("Key #{ key } is not valid") 
end 

作为替代也可以使用Hash#fetch并让它失败KeyError,或指定一个缺省值或者代码块(在new等)被执行时,该键不退出。

+0

但它应该是错误知道,因为没有人叫乔! – tharif

+1

@Jefffrey你可能想看看['Hash#fetch'](http://ruby-doc.org/core/Hash。HTML#方法-i的取)。 – toro2k

+0

谢谢jeffrey – tharif

4

此文档中被明确记载的方法Hash#[]

hsh[key]value

元素参考-检索对应于该键对象对象。如果未找到,则返回默认值(有关详细信息,请参阅Hash::new)。

h = { "a" => 100, "b" => 200 } 
h["a"] #=> 100 
h["c"] #=> nil 

的代码示例中的最后一行甚至可以显示你的确切情况。

那么,为什么不是raiseException?那么,因为访问字典中不存在的密钥并不是一种特殊情况!

另外,它的琐碎与default_procraise 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! 

,如果有没有指定一个默认值的方式,而是你总是会得到一个例外,反过来实施它将会困难得多。

相关问题