rescue
エラー オブジェクトを参照する変数を割り当てることができる の構文は次のとおりです( =>
)
rescue => e
が一般的なメソッド呼び出しの 1 つである場合rescue
、 の意味は何ですか=>
。他のメソッド呼び出しで同じ構文を使用できますか?
my_method arg1, arg2 => my_obj
rescue
エラー オブジェクトを参照する変数を割り当てることができる の構文は次のとおりです( =>
)
rescue => e
が一般的なメソッド呼び出しの 1 つである場合rescue
、 の意味は何ですか=>
。他のメソッド呼び出しで同じ構文を使用できますか?
my_method arg1, arg2 => my_obj
一部のサッカーのコーチ/哲学者王が言うかもしれないように、それはそれです. これが 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 には他に「後方」割り当てはありません。
raise
は確かにメソッドですが、そうでrescue
はありません。これはキーワードであり、parse.y:10467で定義されています。そのため、あなたが持っている構文は特別なものでありrescue
(メソッド=> e
引数のようなものではないため)、メソッド自体には有効ではありません(少なくとも同じ意味ではありません)。構文自体がパーサーでどのように/どこで定義されているかは、完全にはわかりません。rescue => e
いいえ、レスキューの構文はそこでのみ使用されます。そのような関数呼び出しでハッシュロケット「=>」を使用すると、ハッシュとして解釈され、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}