Ruby 2.7の新機能・新メソッド・改善点を徹底解説
Rubyは絶えず進化し続けています。2019年12月25日にリリースされたRuby 2.7には、新機能・新メソッド・パフォーマンス改善が数多く含まれています。
Matzことまつもとゆきひろ氏によると、これは2.x系としては最後のバージョンとなります。翌年にはRuby 3.0が登場する予定だからです。
その前に、2.7で導入された主な変更点と新機能をチェックして、バージョンアップに備えておきましょう。
Enumerable#tally
tallyは、配列内の各要素の出現回数を集計し、ハッシュ形式で返してくれる新しいメソッドです。もちろん自分で実装することもできますが、このメソッドを使えばその手間を大きく省けます。
%w(a a a b b c).tally
実行結果:
{"a"=>3, "b"=>2, "c"=>1}
シンプルで使いやすい、嬉しい追加ですね。
ブロック引数の番号付きパラメータ【実験的機能】
多くの開発者が待ち望んでいた面白い新機能が、ブロック引数にデフォルト名を持たせる「番号付きパラメータ」です。
通常、ブロックは次のように引数を明示的に定義します:
[1,2,3].each { |n| puts n }
ここで|n|が引数にあたり、利用するには必ず定義が必要でした。
しかし、あらかじめ名前が決まっていればどうでしょうか?
Ruby 2.7では、実験的機能ながらこの省力化が実現しました。書き方は以下の通りです:
[1,2,3].each { puts _1 }
_1が最初の引数を指します。第2引数には_2、第3引数には_3というように順番に使えます。
かなり便利ですよね!
余談ですが、この機能は当初@1という記法で提案されていました。しかしインスタンス変数と見分けがつきにくいため、コミュニティでの議論を経て、_1という記法に落ち着いた経緯があります。
Array#intersection
こちらは「新しいメソッド」ではありますが、「新しい機能」というわけではありません。実態はほぼエイリアスのようなものです。
Ruby 2.6では、演算子Array#|やArray#-に対応する、より意図が伝わりやすいメソッドとしてunionとdifferenceが導入されました。しかし、共通部分を求める操作に相当するintersectionだけが欠けていました。短縮版であるArray#&は、正直あまり直感的とは言えません。
これらのメソッドはどのような働きをするのでしょうか?例を見てみましょう:
[1, 2, 3].intersection([2, 3, 4]) # [2, 3] [1, 2, 3] & [2, 3, 4] # [2, 3]
名前から想像できるように、intersectionは2つの配列の積集合、つまり共通する要素を求めるメソッドです。
| 短縮版 | 完全版 |
|---|---|
| & | intersection |
| | | union |
| - | difference |
筆者はいつも、これら3つの中でどれがどの動作だったか忘れてしまいます。しかし新しいメソッドなら名前そのものに意味があるため、格段に覚えやすくなりました。これは「良いコードを書くための教訓」でもありますね。
Enumerable#filter_map
filter_mapは、selectとmapを1つに統合したようなメソッドです。
なぜこのメソッドが求められていたのかというと、「まずリストを絞り込んで、残った要素を変換する」という処理は非常に頻繁に発生するからです。
従来は次の2通りの書き方がありました:
(1..8).select(&:even?).map { |n| n ** 2 }
# OR
(1..8).map { |n| n ** 2 if n.even? }.compact
どちらもよく使われますが、最初の書き方の方が意図が明確で読みやすいでしょう。
Ruby 2.7のfilter_mapを使えば、この処理を1回のパスで完結できます:
(1..8).filter_map { |n| n ** 2 if n.even? }
# [4, 16, 36, 64]
ブロック内にif文を書くスタイルは好みが分かれるところですが、目的によっては必要になることもあります。
加えて、知っておくべき注意点があります。
filter_mapの動作はmap + compactと同じではありません。filter_mapはfalseオブジェクトも除去しますが、compactはnilしか除去しません。この違いは覚えておくと良いでしょう。
Enumerator#produce
もうひとつ興味深いのがEnumerator#produceメソッドです。ただし、その真価を引き出すには少し創造力が求められるかもしれません。
機能提案時の公式な説明には、こうあります:
「このメソッドは無限シーケンスを生成します。各要素は、直前の要素にブロックを適用した結果として計算されます。」
つまり、終わりのないシーケンスを作るためのもうひとつの手段というわけです。
Enumerator.produce(1, &:next).take(5) # [1, 2, 3, 4, 5]
この例では、take(10)でもtake(10_000)でも、必要なだけ値を取り出すことができます。
補足すると、1は初期値であり、&:nextは次の要素をproduce(生成)するために呼び出されるメソッドです。
IRBの大幅リニューアル
近年、IRBは継続的に改良が重ねられており、Ruby 2.7でもさらなる進化を遂げています。
追加された主な機能:
- 複数行編集のサポート
- シンタックスハイライト
- 組み込みのRDoc連携
- コマンド履歴がデフォルトで有効化
- 自動補完がデフォルトで有効化
実際、これは非常に大きな変更のため、Ruby 2.7でirbを起動すると警告が表示されます。
旧バージョンのirbを使い続けたい場合は、irb --legacyコマンドで可能です。筆者が新しいIRBで気になるのは行編集の挙動で、レガシーIRB(やPry)ではALTキーを押しながら左矢印キーでカーソルを素早く移動できましたが、新しいIRBではこの操作が機能しません。
ぜひ実際に試してみて、自分のワークフローに合うか確かめてみてください。
パターンマッチング【実験的機能】
2.7でついに登場した、長年にわたり要望の多かった機能がパターンマッチングです。実験的機能として提供されています。
では、パターンマッチングとは何なのでしょうか?正しく理解するならば、正規表現のデータ構造(配列やハッシュ)版のようなものです。
[1,2,3] in [a,b,c] # true [1,2,3] in [a] # false
マッチが成功すると、変数名(ここではaなど)がローカル変数としてアクセス可能になります。
ハッシュの例:
{ a: 1, b: 2, c: [] } in { a: a, b: b, c: [] }
# true
p a
# 1
ここではinキーワードを使用しています。in自体は新しいキーワードではありませんが、Ruby 2.7以前ではforループ(Rubyでは非推奨とされる構文)でしか使われてこなかったため、今回ようやく有用な形で再利用されることになりました。
さらに良いことに…
変数名は自由に選べます。例ではa,b,cを使っていますが、f,g,hでも問題なく動作します。
重要なのはパターンそのものなのです。
その他の変更点
言及する価値のあるその他の変更点をご紹介します。
- メモリの断片化を改善する新しいコンパクションGC
- メソッド引数
**nilにより、キーワード引数を受け付けないことを明示的に宣言可能に - メソッド引数
...による引数転送の仕組みを追加(括弧が必須、例:make_salad(...)) - Fiberの改善:ファイバーオブジェクトの新しいプールから新規ファイバーを割り当てることで、Fiberがより効率的に
- Threadの改善:より最適化されたスレッド生成方式により、マルチスレッド処理が高速化
これらの変更について、どう思いますか?
2.7のNEWSファイルでは、Fiberとスレッドの生成に関して最大10倍のパフォーマンス向上が言及されています。筆者自身はまだ検証していませんが、試してみた方はぜひ結果を教えてください。
まとめ
これでRubyプログラミング言語の最新の変更点をキャッチアップできました!IRBの変更点、新しいメソッド、そしてパターンマッチングなどの実験的機能について学びました。
ぜひこの記事をシェアして、最新情報を広めてください!
お読みいただきありがとうございました🙂
-
Windows 11の主な新機能と改善点を徹底解説|アップグレード前に知っておきたい全ポイント
Microsoftは、対象となるWindows 10デバイス向けに最新OS「Windows 11」の無料アップグレードを正式に提供開始しました。セキュリティ、生産性、デザインの各面で多数の新機能と改善が加えられています。また、クリーンインストールやPCのトラブルシューティングに使えるWindows 11 ISOイメージも公開されています。従来のWindows 10の更新とは異なり、新しいOSは生産性向上に重点を置き、PCの操作性をシンプルにすることを目指しています。Windows 11(バージョン21H2)にアップグレードすると、中央寄せになったスタートメニュー、新しいFluent Desig
-
Windows 11 正式リリース!新機能・改善点とアップグレード方法を徹底解説
長期間にわたるテストとプレビュービルドの提供を経て、2021年10月5日、MicrosoftはWindows 11の提供開始を正式に発表しました。対象となるWindows 10搭載PCへの無料アップグレード、およびWindows 11プリインストールモデルの新製品という形で、世界中へ展開されています。最新のWindows 11 バージョン21H2には、モダンな新ユーザーインターフェース(UI)、スナップアシストによるマルチタスク機能を備えた再設計のスタートメニュー、Microsoft Teamsの統合、Androidアプリのネイティブ実行、全面刷新されたMicrosoft Store、ウィジェ