🙄

[Bug #21048] 後置 if と rescue が混ざっている場合に prism と parse.y で結果が異なるというバグ報告

2025/01/25に公開

[Bug #21048] [Prism] rescue in modifier form with condition behaves differently

  • 次のように後置 ifrescue が混ざっている場合に prismparse.y で結果が異なるというバグ報告
$called = false
def foo
  $called = true
end

foo rescue nil if false

# prism は foo は呼び出されないが parse.y は foo が呼び出される
puts "Called: #{$called}"
# prism   => Called: true
# parse.y => Called: false
  • これは prismfoo rescue (nil if false) と解釈されて parse.y(foo rescue nil) if false と解釈されているからみたいですね
    • 式1 rescue 式2式1 を評価し、例外が発生すれば 式2 を評価するような処理になるので prism の場合は foo が必ず評価されます
  • これは開発版の Ruby 3.5 で prism の場合でも false を返すように修正されました
$called = false
def foo
  $called = true
end

foo rescue nil if false

# prism は foo は呼び出されないが parse.y は foo が呼び出される
puts "Called: #{$called}"
# Ruby 3.4 prism => Called: true
# Ruby 3.5 prism => Called: false
GitHubで編集を提案

Discussion