📘
[Bug #21139] `it = it` が `prism` と `parse.y` で挙動が異なるというバグ報告
[Bug #21139] Prism and parse.y parses it = it
differently
-
it = it
がprism
とparse.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) }
するともう少しわかりやすですかね?-
prism
は42
でparse.y
はnil
になる
-
- これなんですが最初 matz は以下のようにコメントしていました
- 長期的には
it
への割当は禁止する - 現状の挙動としては
prism
が期待する挙動になる - https://bugs.ruby-lang.org/issues/21139#note-1
- 長期的には
- なんですが現状の Ruby のローカル変数の定義としては『
nil
として扱われる』という挙動になっています
# このときに右辺の a は nil として扱われる
a = a
pp a
- ロジック的には以下のような感じですかね?
- 構文がパースされるタイミングで右辺の
a
は『変数』として認識される - また『変数の初期値』は
nil
になるのでa = nil
として扱われる - 実際に実行するタイミングで『
a
の値をa
変数に代入する』つまり『a = nil
になる』
- 構文がパースされるタイミングで右辺の
- と、いうのを踏まえた上で最終的には
parse.y
のほうが期待する挙動になるみたいですね
Discussion