Почему форматирование / синтаксис для хэшей assert_equal отличается от других assert_equals? - PullRequest
14 голосов
/ 14 апреля 2011

Я пробираюсь через Ruby Koans и в настоящее время нахожусь на AboutHashes.До этого момента assert_equals следовали определенному стилю форматирования: assert_equal пробел expected_value запятая actual value (например, assert_equal 2, 1 + 1).Но определение test_creating_hashes в About Hashes имеет assert_equal, который не следует этому шаблону, и если я изменю его в соответствии с этим шаблоном, произойдет сбой.В частности:

def test_creating_hashes
  empty_hash = Hash.new
  assert_equal {}, empty_hash  # --> fails 
  assert_equal({}, empty_hash) # --> passes  
end

Так что же особенного в assert_equal в этой ситуации?

Суть сообщения об ошибке теста:

<internal:lib/rubygems/custom_require>:29:in `require':    /Ruby_on_Rails/koans/about_hashes.rb:7: syntax error, unexpected ',', expecting keyword_end (SyntaxError)
assert_equal {}, empty_hash #{} are also used for blocks
                ^
from <internal:lib/rubygems/custom_require>:29:in `require'
from path_to_enlightenment.rb:10:in `<main>'

1 Ответ

24 голосов
/ 14 апреля 2011

Сбой, потому что Ruby анализирует первый пример как передачу пустого блока {}, а не пустого хеша. Я не удивлюсь, если он выдаст ошибку SyntaxError (см. Ниже).

Однако, явно указав скобки, вы говорите ruby ​​«это аргументы, которые я хочу передать этому методу».

def t(arg1, arg2)
  p arg1
end


ruby-1.9.2-p136 :057 > t {}
ArgumentError: wrong number of arguments (0 for 2)
ruby-1.9.2-p136 :056 > t {}, arg2
SyntaxError: (irb):56: syntax error, unexpected ',', expecting $end
t {}, arg2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...