我要从RubyKoans开始讨论about_hashes.rb。 1次练习让我感到困惑:
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”成为所有不存在键的默认答案。我是对的吗?
答案 0 :(得分:9)
是的,你是对的,看起来红宝石公司出现了错误,hash2[:two]
会返回"dos"
查看Hash.new方法文档
new→new_hash
new(obj)→new_hash
new {| hash,key |阻止}→new_hash返回一个新的空哈希。如果随后由a访问此哈希 返回的值与哈希条目不对应的键 取决于用于创建哈希的新样式。在第一个 表单,访问返回nil。 如果指定了obj,则为此单个对象 将用于所有默认值。如果指定了一个块,它将会 用哈希对象和键调用,应该返回 默认值。存储该值的是块的责任 如果需要,哈希。
答案 1 :(得分: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?