📘

[Bug #21139] `it = it` が `prism` と `parse.y` で挙動が異なるというバグ報告

に公開

[Bug #21139] Prism and parse.y parses it = it differently

  • it = itprismparse.y で挙動が異なるというバグ報告
# prism は右辺の it が 42 として扱われる
$ ruby --parser=prism -e "42.tap { it = it; p it }"
42
# parse.y は右辺の it が nil として扱われる
$ ruby --parser=parse.y -e "42.tap { it = it; p it }"
nil
  • 42.tap { it = p(it) } するともう少しわかりやすですかね?
    • prism42parse.ynil になる
  • これなんですが最初 matz は以下のようにコメントしていました
  • なんですが現状の Ruby のローカル変数の定義としては『 nil として扱われる』という挙動になっています
# このときに右辺の a は nil として扱われる
a = a
pp a
  • ロジック的には以下のような感じですかね?
    1. 構文がパースされるタイミングで右辺の a は『変数』として認識される
    2. また『変数の初期値』は nil になるので a = nil として扱われる
    3. 実際に実行するタイミングで『 a の値を a 変数に代入する』つまり『 a = nil になる』
  • と、いうのを踏まえた上で最終的には parse.y のほうが期待する挙動になるみたいですね
GitHubで編集を提案

Discussion