Ruby koans:about_hashes.rb 'test_default_value' 的解决方案有何意义?

Ruby koans: How does the solution to about_hashes.rb 'test_default_value' make sense?

对于Ruby koan 40,命令行告诉我这段代码中的下划线部分...

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

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

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

    assert_equal 1, hash2[:one]
    assert_equal __, hash2[:two] # <<<< here's the underscore section
end

...应该是 "dos"。在初始化 hash2 时没有指定键的情况下,Ruby 如何将 "dos" 分配给 :two 键?如果这有意义,我会感到非常惊讶。

但如果你能让我明白,那就太好了!

new 方法的值是缺失键的默认值。

根据 docs

If this hash is subsequently accessed by a key that doesn’t correspond to a hash entry, the value returned depends on the style of new used to create the hash. In the first form, the access returns nil. If obj is specified, this single object will be used for all default values.

hash2 初始化为默认值 "dos"

hash2 = Hash.new("dos") 

因此,每次访问未明确分配值的键时,您都会得到 "dos" 返回。请注意,每个散列都有一个默认值。默认情况下,它只是 nil.

默认值不是 "assigned"。当访问一个散列值时,Ruby 试图首先找到一个在散列中明确设置的值。只有找到 none 时,才会 returns 默认值。

最后说一句:创建散列时还有另一种设置默认值的形式:

my_hash = Hash.new { |hash, key| hash[key] = "dos" }

一般来说,这里首选这种形式,每次访问不存在的键时,默认值都是一个新对象。如果您想就地更改默认值(在数组或另一个哈希的情况下您经常会这样做),这一点很重要。

对于简单的东西,这可能并不重要。只是为了以后记住:)