Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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#-に対応する、より意図が伝わりやすいメソッドとしてuniondifferenceが導入されました。しかし、共通部分を求める操作に相当する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は、selectmapを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_mapfalseオブジェクトも除去しますが、compactnilしか除去しません。この違いは覚えておくと良いでしょう。

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の変更点、新しいメソッド、そしてパターンマッチングなどの実験的機能について学びました。

ぜひこの記事をシェアして、最新情報を広めてください!

お読みいただきありがとうございました🙂

  1. Windows 11の主な新機能と改善点を徹底解説|アップグレード前に知っておきたい全ポイント

    Microsoftは、対象となるWindows 10デバイス向けに最新OS「Windows 11」の無料アップグレードを正式に提供開始しました。セキュリティ、生産性、デザインの各面で多数の新機能と改善が加えられています。また、クリーンインストールやPCのトラブルシューティングに使えるWindows 11 ISOイメージも公開されています。従来のWindows 10の更新とは異なり、新しいOSは生産性向上に重点を置き、PCの操作性をシンプルにすることを目指しています。Windows 11(バージョン21H2)にアップグレードすると、中央寄せになったスタートメニュー、新しいFluent Desig

  2. Windows 11 正式リリース!新機能・改善点とアップグレード方法を徹底解説

    長期間にわたるテストとプレビュービルドの提供を経て、2021年10月5日、MicrosoftはWindows 11の提供開始を正式に発表しました。対象となるWindows 10搭載PCへの無料アップグレード、およびWindows 11プリインストールモデルの新製品という形で、世界中へ展開されています。最新のWindows 11 バージョン21H2には、モダンな新ユーザーインターフェース(UI)、スナップアシストによるマルチタスク機能を備えた再設計のスタートメニュー、Microsoft Teamsの統合、Androidアプリのネイティブ実行、全面刷新されたMicrosoft Store、ウィジェ