8

リテラルハッシュを使用respond_withして渡すと、エラーが発生しました:

syntax error, unexpected tASSOC, expecting '}'
`respond_with {:status => "Not found"}`

ただし、リテラル ハッシュをかっこで囲むと、次のようになります。

respond_with({:status => "Not found"})

機能は問題なく実行されます。括弧によって違いが生じるのはなぜですか? ハッシュは同封された呼び出しではありませんか?

4

1 に答える 1

12

メソッドを呼び出すとき、メソッド名の直後にある開き中かっこは、ブロックの開始として解釈されます。これは、ハッシュとしての解釈よりも優先されます。この問題を回避する 1 つの方法は、括弧を使用して解釈をメソッド引数として強制することです。例として、これら 2 つのメソッド呼び出しの意味の違いに注意してください。

# interpreted as a block
[:a, :b, :c].each { |x| puts x }

# interpreted as a hash
{:a => :b}.merge({:c => :d}) 

別の方法は、メソッドの最後の引数の括弧をいつでもスキップできるため、中括弧を取り除くことです。Ruby は、引数リストの末尾にある連想リストのように見えるすべてのものを単一のハッシュとして解釈するほど「賢い」。この例を見てください:

def foo(a, b)
  puts a.inspect
  puts b.inspect
end

foo "hello", :this => "is", :a => "hash"
# prints this:
# "hello"
# {:this=>"is", :a=>"hash"}
于 2013-03-05T22:13:03.520 に答える