Ruby がインライン エラー ハンドラをどのように扱うかについて、いくつか理解したいことがあります。
ケース1
これは一般的な使用例です
def foo
raise Error
end
bar = foo rescue 1
# => 1
bar
# => 1
期待どおりに動作します。式foo rescue 1
が返さ1
れ、 に正しく割り当てられbar
ます。
ケース 2
Ruby では配列の分解が許可されているため、この動作は奇妙に思えます。
baz = 'a'
baz, bar = foo rescue [1, 2]
# => [1, 2]
baz
# => 'a'
bar
# => nil
式は配列を返しますが、[1, 2]
分解も代入もしません。割り当てを完全にスキップします。
ケース 3
ただし、エラーを括弧で囲むと、分解が機能します。
baz, bar = (foo rescue [1, 2])
# => [1, 2]
baz
# => 1
bar
# => 2
ケース 4
ボーナス ポイント: エラーを発生させてインラインで処理しようとすると、割り当てもスキップされます
baz = raise Error rescue 1
# => 1
baz
# => nil
しかし、括弧を追加すると機能します。
編集:
Ruby 1.9.3-p392 および Ruby 2.0.0 でこれをテストしました
編集2:
ケースにラベルを追加しました
編集3:
どうやらこれは質問ではないと考える人もいるようです。そのため、タイトルが十分に明白ではなかったのかもしれません。質問の全文は次のとおりです。
これらの不一致はなぜ発生し、括弧を追加すると何かが変わるのはなぜですか?