Подтвердить что ты не робот

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

Я прокладываю себе путь через Ruby Koans и в настоящее время нахожусь в AboutHashes. До этого момента assert_equals придерживались определенного стиля форматирования: assert_equal space expected_value запятая actual value (например, assert_equal 2, 1 + 1). Но test_creating_hash def в разделе "О хэш" имеет аргумент 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>'
4b9b3361

Ответ 1

Это терпит неудачу, потому что 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