我正在學習Ruby語言,在編寫簡單的打印操作時,我看到了一件奇怪的事情。代碼如下:哈希值不存在時,爲什麼不會拋出異常?
z = { 'mike' => 75, 'bill' => 18, 'alice' => 32 }
print z['bill'], " ", z['joe'], " "\n"
這裏我得到輸出爲18
;即使joe
沒有可用的值,它也不會引發任何錯誤。
這是爲什麼?在其他語言如c#
它會拋出異常!
是因爲我使用在線編譯器編譯它嗎?
我正在學習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