🙆♀️
[Bug #21117] _1 と it で動作に差異があるというバグ報告
[Bug #21117] Inconsistent behaviour between "_1" and "it" variables
- Ruby 3.4 では
_1
の別名としてit
が追加されました - この
it
は_1
と同様に『ブロックの第一引数を参照する』特別な構文になります
# .map { |it| it * 2 } と同等
pp (1..10).map { it * 2 }
-
_1
とit
は同じ機能ではあるんですが、以下のように差異があるというバグ報告
# it 変数に再代入することは可能
pp [1, 2, 3].map { it = it + 1; it }
# => [2, 3, 4]
# _1 では SyntaxError になる
pp [1, 2, 3].map { _1 = _1 + 1; _1 }
# => [2, 3, 4]
- これなんですが
_1
は意図的に同名での変数定義は禁止されています - なので以下のようなコードでも SyntaxError になります
# error: _1 is reserved for numbered parameters
_1 = 42
- 一方で
it
は互換性の問題からit
という名前の変数定義は許容されています
# OK
it = 42
-
it
に関しては互換性を保つ必要がるのでいろいろとややこしいんですよねえ - 詳しくは以下を参照してください
- 他にも
_1
とit
で差異があるケースがあるのでそのうちまとめたい
Discussion