1

括弧で囲まれたメソッドパラメータが好きです。これはPascalの懐かしさです。コードをクリーンアップするときに、それがないメソッドパラメータを見つけた場合は、すぐにそれらを囲みます。ドキュメントによると構文は問題ないように見えますが、今日は動作中のコードがエラーをスローする原因になりました。

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

私はそれなしで生きることができます、私はこれがなぜエラーで終わるのか知りたいだけです。

4

2 に答える 2

5

慣用的なRubyでは、メソッドの末尾と括弧内の引数リストの間にスペースを挿入することは決してないことをすでにご存知でしょう。一部のスタイルガイドは明示的にそれを禁止しています。

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

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は「親なし」スタイルを期待しているためだと思います。もちろん、これは機能します。

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

おそらく、Rubyは、結果をメソッドに渡す前に、括弧で囲まれた各式の内容を評価しようとしています。raise (TypeError, "Error message")執筆はRubyにただ評価するように求めていると思いTypeError, "Error message"ますが、もちろん失敗します。

于 2012-03-30T09:23:16.617 に答える
3

Ruby では、括弧は式のグループ化と優先順位のオーバーライドに使用されます。だから、あなたが言うとき

foo (bar, baz)

:foo式を評価した結果である単一の引数でメッセージを送信していますbar, baz。Andbar, bazは有効な式ではないため、SyntaxError.

foo (bar)

barは有効な式であるため、機能します。

foo (if bar then baz else quux end)

もうまくいくでしょう。

式のグループ化のためではなく、メッセージ送信とともに複数の引数を渡すために Ruby に括弧を解釈させたい場合は、左括弧をメッセージ セレクターの直後に置く必要があります。

foo(bar, baz)

Kernel#raiseこれは、ところで、何の関係もありません。Ruby でメッセージ送信の構文を変更することはできません (実際、Ruby では構文を変更することはできません)。そのためKernel#raise、すべてのメソッドに当てはまるものはすべて、他のすべてのメソッドにも当てはまる必要があります。

于 2012-03-30T09:42:12.470 に答える