2015-05-29 121 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! 

,如果有沒有指定一個默認值的方式,而是你總是會得到一個例外,反過來實施它將會困難得多。