为什么assert_equal哈希的格式/语法与其他assert_equals不同?

Mac*_*ean 14 ruby syntax

我正在通过Ruby Koans工作,现在我正在AboutHashes.到目前为止,assert_equals遵循特定的格式样式:assert_equal空格expected_value逗号actual value(例如,assert_equal 2, 1 + 1).但是About Hashes中的test_creating_hashes def有一个不遵循这种模式的assert_equal,如果我改变它以匹配该模式,它就会失败.特别:

def test_creating_hashes
  empty_hash = Hash.new
  assert_equal {}, empty_hash  # --> fails 
  assert_equal({}, empty_hash) # --> passes  
end
Run Code Online (Sandbox Code Playgroud)

那么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>'
Run Code Online (Sandbox Code Playgroud)

Mik*_*wis 24

它失败了,因为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
Run Code Online (Sandbox Code Playgroud)

  • `assert_equal ({}),empty_hash` 也有效。我假设这意味着解析器将 `({})` 解释为空哈希? (2认同)