2016-07-05 37 views
-2

Ruby如何在散列中查找鍵?我認爲只要它在散列中找到一個鍵,它就會返回它的值而不評估其他鍵/值對?但我想我錯了。 例如,如何查找Ruby中的散列工作?

test = {"a" => 10, "b" => 20, "c" => 30, "d" => 1/0} 

現在如果我做test["a"],它返回因爲D的無限價值的錯誤,如果我刪除「d」,它工作正常(這意味着它會檢查,即使它找到的所有鍵/值對第一個鍵中的匹配)。因此,如果我在一個非常大的散列中搜索關鍵字,那麼在返回該特定散列的值之前,Ruby是否評估每個鍵/值的有效性?如果是這樣的話,一旦找到密鑰,是否有辦法突破散列?

UPDATE 只是爲了澄清,我想了解它如何在Ruby中工作。所以,例如,如果我有500個鍵/值對(所有有效不像1/0)的散列,並且可以說「a」是第一個鍵。因此,如果我在這個大散列上測試[「a」],Ruby是否會將所有鍵/值對加載到內存中,或者只是在找到鍵「a」後纔打開?

+0

我得到一個錯誤,試圖運行您的初始化。 1/0在哈希創建時計算... 您使用的是哪個版本的ruby? – Antzi

+0

irb(main):001:0> test = {「a」=> 10,「b」=> 20,「c」=> 30,「d」=> 1/0} ZeroDivisionError:除以0 \t從(IRB): '從(IRB) \t:從/Users/za/.rbenv/versions/2.3.0/bin/irb:11:in' \t' 在'/:1 – zee

+0

同樣在這裏,它拋出了一個異常..這是預期的。 – zee

回答

2

你得到的錯誤發生在ruby創建哈希時,而不是在訪問哈希時 - 將值插入哈希明確需要評估它們。

當從哈希中獲取值時,沒有「加載」:整個哈希總是在內存中。對哈希表的完整解釋有點超出範圍,但簡而言之,哈希通過哈希來得到哪個哈希桶應該包含該值的關鍵字。然後搜索該桶並在找到該密鑰時返回該值。