この記事は?
Ruby 3.4 で導入される it について説明します。
it とは?
来たる Ruby 3.4 ではデフォルトのブロックパラメータとして it が使えるようになります (まるで Kotlin の it みたいですね) 。it は暗黙的にブロックに渡された 1 番目のパラメータを参照します。この場合、配列の各要素です。ブロックパラメータを明示的に指定する必要がなく、ブロックをよりシンプルに書けるようになります。
# 通常のブロックパラメータ
[2, 4, 1, 3].sort_by { |n| n }
#=> [1, 2, 3, 4]
# it
[2, 4, 1, 3].sort_by { it }
#=> [1, 2, 3, 4]
既存の番号指定パラメータとも似ています。
# 番号指定パラメータ
[2, 4, 1, 3].sort_by { _1 }
#=> [1, 2, 3, 4]
# it
[2, 4, 1, 3].sort_by { it }
#=> [1, 2, 3, 4]
なぜ、すでに番号指定パラメータという似た仕組みが存在するのに it が追加されるのでしょうか?それは Ruby の Redmine のチケット #18980 で言及されていました。認知的なオーバーヘッドを軽減するというのが目的のようです。
Why I don't use _1
I'm not clever enough to remember the order of parameters. Therefore, when a block has multiple parameters, I'd always want to name those parameters because which is _1 or _2 is not immediately obvious. Thus I would use this feature only when a block takes a single argument, which is actually pretty common.
If I use _1, it feels like there might be a second argument, and you might waste time to think about _2, even if _2 doesn't exist, which is a cognitive overhead. If you use it, it kinda implies there's only a single argument, so you don't need to spend time remembering whether _2 exists or not. It is important for me that there's no number in it.
なぜ私は _1 を使わないのか
私はパラメータの順番を覚えるほど賢くないからです。そのため、ブロックに複数のパラメータがある場合にパラメータに名前を付けたいです。なぜなら _1 なのか _2 なのかがすぐに分からないからです。したがって、この機能を使うのは、ブロックが単一の引数を取る場合のみです。これは実際によくあることです。
_1 を使用すると、2 番目の引数があるのだと考えます。_2 が存在しなくても _2 について考えるのに時間を費やしてしまう場合があります。これは認知的なオーバーヘッドです。もし it を使用すると引数が 1 つだけであることを暗示するので、_2 が存在するかどうかを覚えるのに時間を費やす必要がなくなります。数字が含まれていないことが私にとっては重要です。
バージョン情報
$ ruby -v
ruby 3.4.0preview2 (2024-10-07 master 32c733f57b) +PRISM [arm64-darwin23]