Значения хэша по умолчанию в Ruby (Rubykoans.com -> about_hashes.rb) - PullRequest
6 голосов
/ 08 февраля 2012

Я просматриваю about_hashes.rb из RubyKoans . 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 ]

9 голосов
/ 08 февраля 2012

Да, вы правы, похоже, что в ruby ​​koans произошла ошибка, hash2[:two] вернет "dos"

Взгляните на Hash.new документация метода

new → new_hash new (obj) → new_hashновый {| хеш, ключ |block} → new_hash

Возвращает новый пустой хеш.Если впоследствии к этому хешу обращается ключ, который не соответствует записи хеша, возвращаемое значение зависит от стиля нового, используемого для создания хеша.В первой форме доступ возвращает ноль. Если указан объект obj, этот единственный объект будет использоваться для всех значений по умолчанию .Если указан блок, он будет вызван с хеш-объектом и ключом и должен вернуть значение по умолчанию.Блок обязан хранить значение в хэше, если это необходимо.

Sidenote : Вы можете подтвердить свои ожидания в таких случаях, запустив реальный код или выполнив парустроки в irb или pry (я рекомендую pry).

4 голосов
/ 08 февраля 2012

Оригинал коана:

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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...