Ruby中的默认哈希值(Rubykoans.com - > about_hashes.rb)

Bar*_*ira 6 ruby hash

我正在浏览RubyKoans的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
Run Code Online (Sandbox Code Playgroud)

我的猜测是Hash.new("dos")使"dos"成为所有不存在键的默认答案.我对吗?

Ali*_*kau 9

是的,你是对的,看起来像红宝石一样的错误,hash2[:two]会回来"dos"

看一下Hash.new方法文档

new→new_hash
new(obj) →new_hash
new {| hash,key | 阻止}→new_hash

返回一个新的空哈希.如果随后通过与散列条目不对应的键访问此散列,则返回的值取决于用于创建散列的新样式.在第一种形式中,访问返回nil.如果指定了obj,则此单个对象将用于所有默认值.如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值.如果需要,块负责将值存储在哈希中.

旁注:在这种情况下,您可以通过运行实际代码或在irbpry中执行几行来确认您的期望(我建议使用pry).