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

时间:2012-02-08 11:58:15

标签: ruby hash

我要从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”成为所有不存在键的默认答案。我是对的吗?

2 个答案:

答案 0 :(得分:9)

是的,你是对的,看起来红宝石公司出现了错误,hash2[:two]会返回"dos"

查看Hash.new方法文档

  

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

     

返回一个新的空哈希。如果随后由a访问此哈希   返回的值与哈希条目不对应的键   取决于用于创建哈希的新样式。在第一个   表单,访问返回nil。 如果指定了obj,则为此单个对象   将用于所有默认值。如果指定了一个块,它将会   用哈希对象和键调用,应该返回   默认值。存储该值的是块的责任   如果需要,哈希。

Sidenote :您可以通过运行实际代码或在irbpry中执行几行来确认您的期望(我建议使用pry)。< / p>

答案 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?