3

次のルビーインラインレスキューコードの何が問題なのか特定できません

def test_check()
p  "first st"
t = 5 * lsdj rescue return false
p "second"
end

p test_check

これはエラーメッセージを表示します syntax error, unexpected kFALSE, expecting kEND が、代入ステートメントを削除すると正常に機能します(falseを返します)。

 def test_check()
    p  "first st"
     5 * lsdj rescue return false
    p "second"
    end

何かが間違っている場合、ルビーのインラインレスキューの正しい構文は何ですか。

4

2 に答える 2

12

インラインは、割り当て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
これは、たまたま他の文法規則と一致するため、希望どおりに機能します。詩モードをサポートするために、これらの制限のいくつかが存在すると聞きました。

于 2013-02-27T16:53:45.640 に答える
2

コードは次のように解釈されます。

def test_check()
p  "first st"
t = (5 * lsdj rescue return) false
p "second"
end

これによりfalse、無効な位置になります。これを修正するには、かっこを付けます。

def test_check()
p  "first st"
t = 5 * lsdj rescue (return false)
p "second"
end
于 2013-02-27T16:56:24.280 に答える