2012-02-08 75 views
6

我正在通過RubyKoans的about_hashes.rb。 1個運動讓我不解:Ruby中的默認哈希值(Rubykoans.com - > about_hashes.rb)

def test_default_value 
    hash1 = Hash.new 
    hash1[:one] = 1 

    assert_equal 1, hash1[:one] #ok 
    assert_equal nil, hash1[:two] #ok 

    hash2 = Hash.new("dos") 
    hash2[:one] = 1 

    assert_equal 1, hash2[:one] #ok 
    assert_equal "dos", hash2[:two] #hm? 
    end 

我的猜測是,Hash.new(「DOS」),使「DOS」的所有不存在鍵默認回答。我對嗎?

回答

9

是的,你是對的,貌似還有紅寶石koans一個錯誤,hash2[:two]將返回"dos"

看看Hash.new方法的文檔

新→new_hash
新(OBJ )→new_hash
new {| hash,key |塊}→new_hash

返回一個新的空的散列。如果隨後通過不對應於散列條目的 鍵訪問此散列,則返回值 的值取決於用於創建散列的新樣式。在第一個 表單中,訪問返回nil。 如果指定obj,則此單個對象 將用於所有默認值。如果指定了一個塊,則將使用散列對象和鍵調用 ,並應返回 默認值。如果需要,塊的責任是將值存儲在 哈希中。

旁註:您可以通過運行實際的代碼,或在irbpry執行幾行確認在這種情況下,您的期望(我建議撬)。

+0

我編輯了我的問題,它應該是「dos」而不是零。 – 2012-02-08 14:45:44

4

的公案的原文是:

def test_default_value 
    hash1 = Hash.new 
    hash1[:one] = 1 

    assert_equal __, hash1[:one] 
    assert_equal __, hash1[:two] 

    hash2 = Hash.new("dos") 
    hash2[:one] = 1 

    assert_equal __, hash2[:one] 
    assert_equal __, hash2[:two] 
end 

的錯誤不是在公案,但在斷言你已經完成:

assert_equal nil, hash2[:two] #hm? 

...應該是

assert_equal "dos", hash2[:two] #hm? 
+0

我編輯了我的問題,應該是「dos」而不是零。 – 2012-02-08 14:45:59