🙆‍♀️

[Bug #21117] _1 と it で動作に差異があるというバグ報告

2025/02/11に公開

[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 }
  • _1it は同じ機能ではあるんですが、以下のように差異があるというバグ報告
# 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 に関しては互換性を保つ必要がるのでいろいろとややこしいんですよねえ
  • 詳しくは以下を参照してください
  • 他にも _1it で差異があるケースがあるのでそのうちまとめたい
GitHubで編集を提案

Discussion