2012-03-30 2 views
1

メソッドパラメータがカッコで囲まれているのが好きですが、これはパスカルの懐かしさです。コードをクリーンアップするときに、メソッドのパラメータがなければ、すぐにそれらを囲みます。 今日、私の構文はドキュメントによれば大丈夫ですが、私のワーキングコードでエラーが発生しました。Ruby Kernel.raiseメソッドは、パラメータをカッコで囲むときにエラーをスローする

Kernel.raiseのマニュアルは、この形式になっています。

(Object) raise(exception[, string [, array]]) 

これらはすべての作業です:

> raise TypeError 
TypeError: TypeError 

> raise (TypeError) 
TypeError: TypeError 

> raise "Error message" 
RuntimeError: Error message 

> raise ("Error message") 
RuntimeError: Error message 

しかし、次の囲まれたバージョンでは、構文エラーがスローされます:

> raise TypeError, "Error message" 
TypeError: Error message 

> raise (TypeError, "Error message") 
SyntaxError: unexpected ')', expecting $end 

私は私はちょうどそれがエラーで終わる理由を知りたいです。

答えて

5

慣用のRubyでは、メソッドの終わりと引数リストの間に括弧で囲まれたスペースは決して挿入されないことはすでに分かっているでしょう。 Someスタイルガイドexplicitly forbid it

実用的な理由もあります。

1.9.2-p290 > def concat(a, b) 
1.9.2-p290 > a + b 
1.9.2-p290 > end 

1.9.2-p290 > concat 'foo', 'bar' 
=> "foobar" 
1.9.2-p290 > concat('foo', 'bar') 
=> "foobar" 
1.9.2-p290 > concat ('foo', 'bar') 
SyntaxError: (irb):27: syntax error, unexpected ',', expecting ')' 

あなただけではなくKernel.raise、このよう任意のメソッドを呼び出し、エラーが発生します。

私はRubyの内部についてよく知らないけど、その理由は、引数リストの前にスペースがあると、Rubyは「no-parens」スタイルを期待しているからです。もちろん、これは動作します:

1.9.2-p290 :035 > concat ("bar"), ("foo") 
=> "barfoo" 

はおそらくRubyのメソッドに結果を渡す前に、各括弧で囲まれた式の内容を評価しようとしています。私はちょうど TypeError, "Error message"を評価するためにRubyに質問しています。

3

括弧は、Rubyでの式のグループ化と優先順位の上書きに使用されます。あなたは

foo (bar, baz) 

を言うときので、あなたは表現bar, bazを評価した結果である単一の引数でのメッセージ:fooを送っています。 bar, bazは有効な式ではないため、SyntaxErrorとなります。

foo (bar) 

barが有効な式であるためです。

foo (if bar then baz else quux end) 

も有効です。

あなたはRubyは送信されませ表現のグループ化のためではなく、メッセージと共に複数の引数を渡すために括弧を解釈したい場合は、左括弧が直接メッセージセレクタに従っている必要があります

foo(bar, baz) 

これはとは何の関係もありませんKernel#raise、BTW。Rubyでメッセージ送信の構文を変更することはできません(はRubyでの構文を変更できません)。したがって、Kernel#raiseに該当するものは他のすべてのメソッドについても真でなければなりません。