我正在浏览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"成为所有不存在键的默认答案.我对吗?
是的,你是对的,看起来像红宝石一样的错误,hash2[:two]会回来"dos"
看一下Hash.new方法文档
new→new_hash
new(obj) →new_hash
new {| hash,key | 阻止}→new_hash返回一个新的空哈希.如果随后通过与散列条目不对应的键访问此散列,则返回的值取决于用于创建散列的新样式.在第一种形式中,访问返回nil.如果指定了obj,则此单个对象将用于所有默认值.如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值.如果需要,块负责将值存储在哈希中.
旁注:在这种情况下,您可以通过运行实际代码或在irb或pry中执行几行来确认您的期望(我建议使用pry).