インラインは、割り当て1,2rescue
で使用される場合、パラメーターとしてステートメントを取りません。救助された場合の式の値が必要なだけです。
しかし、注意してください、これは何を返すと思いますか?
def q
return 5 * lsdj rescue false
true
end
falseではなく、 trueを返します。代わりにこのようにして、レスキューがエクスプレッションにのみ適用されるようにします。
def q
return (5 * lsdj rescue false)
true
end
これはfalseを返します。
ノート。
1.それは実際には本当に良い質問です。言い換え:a = bレスキューstmtがエラーであるのに、stmtレスキューstmtがエラーではないのは
なぜ ですか?そして表面的な答えは、割り当ての場合、rhsとrescueステートメントはルビー文法のarg非終端記号であり、完全なステートメントではないのに対し、ステートメントの場合、文法は単にレスキュー後に完全なstmtルールを解析するということです。それはまさにそれが定義されている方法です。さて、あなたがそれから尋ねるなら、それはなぜですか?...まあ...Rubyの複雑な文法はyacc(1)の周辺にあります
することができます。多くの場合、Matzは、exprのような単一の非終端記号を使用するのではなく、特定の場合に受け入れられるものを正確に詳しく説明しているように見えます。その理由は、文法LALR(1)と避けられないシフトを制限し、競合を許容可能なスペースに減らします。興味深い読み物については、Rubyソースディストリビューションのparse.yをチェックしてください。
2.例を次に示します。def q; (t = 5 * lsdj) rescue return false; true; end
これは、たまたま他の文法規則と一致するため、希望どおりに機能します。詩モードをサポートするために、これらの制限のいくつかが存在すると聞きました。