2012-02-08 49 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