7

rescueエラー オブジェクトを参照する変数を割り当てることができる の構文は次のとおりです( =>)

rescue => e

が一般的なメソッド呼び出しの 1 つである場合rescue、 の意味は何ですか=>。他のメソッド呼び出しで同じ構文を使用できますか?

my_method arg1, arg2 => my_obj
4

3 に答える 3

4

一部のサッカーのコーチ/哲学者王が言うかもしれないように、それはそれです. これが Ruby のparse.yです。特に興味深いのは、次の部分です。

opt_rescue      : keyword_rescue exc_list exc_var then
                  compstmt
                  opt_rescue
                    ...
                | none
                ;

exc_list        : arg_value
                    ...
                | mrhs
                    ...
                | none
                ;

exc_var         : tASSOC lhs
                    ...
                | none
                ;

説明
exc_listでは基本的に、何も許可しない、例外タイプを許可する、または (分割された) 一連の例外をrescue ZeroDivisionError, LoadError

exc_var何もないか、=> some_variable

opt_rescueしたがって、rescueはそれ自体でも、上記のいずれかまたは両方を加えたものでもかまいません。

ここでは、例外の代入の特別な構文としてのみリストされています。の他の唯一の用途=>は、キーと値の関連付けです。

arg_valueまた、とmrhsは左側にあり、右側にあることに注意してくださいlhs。私が知る限り、これが発生する唯一の場所です。ここで間違っている場合は誰かが訂正してくれますが、parse.y には他に「後方」割り当てはありません。

于 2012-03-13T16:01:18.680 に答える
4

raiseは確かにメソッドですが、そうでrescueはありません。これはキーワードであり、parse.y:10467で定義されています。そのため、あなたが持っている構文は特別なものでありrescueメソッド=> e引数のようなものではないため)、メソッド自体には有効ではありません(少なくとも同じ意味ではありません)。構文自体がパーサーでどのように/どこで定義されているかは、完全にはわかりません。rescue => e

于 2012-03-13T15:57:55.333 に答える
0

いいえ、レスキューの構文はそこでのみ使用されます。そのような関数呼び出しでハッシュロケット「=>」を使用すると、ハッシュとして解釈され、arg2 が以前に変数として定義されていなかった場合、エラーになります。

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

foo "bar", :baz => 5   #=> {:baz=>5}

foo "bar", baz => 5    #=> NameError: undefined local variable or method `baz'

baz = "flux"

foo "bar", baz => 5   #=> {"flux"=>5}
于 2012-03-13T15:58:47.183 に答える