Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説
Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。
本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。
1. 無限Range(Endless Range)
Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。
新しい無限Rangeは次のように書きます。
(1..)
通常のRangeが(1..10)のように終端の値を持つのに対し、この書き方では終端値を省略できるのが特徴です。
使用例:
["a", "b", "c"].zip(1..) # [["a", 1], ["b", 2], ["c", 3]] [1,2,3,4,5][1..] # [2, 3, 4, 5] (1..).step(5).take(100) # [1, 6, 11, 16, 21, 26, 31, 36, 41, 46]
配列の先頭要素をスキップした残りを取得したり、連番を振ったりする場面で特に便利です。ほかにもどんな活用方法が思いつくか、ぜひ考えてみてください。
2. Enumerable::ArithmeticSequence
Ruby 2.6では、新しい種類のEnumerableオブジェクトとしてEnumerable::ArithmeticSequence(等差数列)が導入されました。
このオブジェクトを返すメソッドは、現時点で2つあります。
- Range#step
- Numeric#step
ArithmeticSequenceの特別な点は、要素数・最初の要素・最後の要素といった情報を把握していることです。
例:
(1..10).step(2).first # 1 (1..10).step(2).last # 9
これらのfirst・lastメソッドはRuby 2.5以前では利用できませんでした。ArithmeticSequenceはまさにそのために導入されたのです。
もうひとつの違いとして、等差数列同士を比較できるようになりました。
(1..10).step(2) == (1..10).step(2) # false - Ruby 2.5(およびそれ以前) (1..10).step(2) == (1..10).step(2) # true - Ruby 2.6
3. 複数の引数によるハッシュのマージ
複数のハッシュを1つに結合したい場合、従来は次のように書く必要がありました。
a = { a: 1 }
b = { b: 2 }
c = { c: 3 }
a.merge(b).merge(c)
# {:a=>1, :b=>2, :c=>3}
Ruby 2.6では新しい書き方が可能に:
a.merge(b, c)
# {:a=>1, :b=>2, :c=>3}
結果は同じですが、メソッド呼び出しが1回で済むため、コードがすっきりと読みやすくなります。
4. 変換メソッドのexceptionキーワード引数
Integerのような型変換メソッドを使う際、変換できない値を渡すと例外が発生します。
例:
Integer("a")
# ArgumentError (invalid value for Integer(): "a")
Ruby 2.6では、以下のメソッドに新しいexceptionキーワード引数が追加されました。
- Integer()
- Float()
- Rational()
- Complex()
このキーワード引数を使えば、これらのメソッドの挙動を柔軟に制御できます。
例:
Integer("a", exception: false)
# nil
exception: falseを指定すると、例外の代わりにnilが返されるため、変換の成否をシンプルにチェックできるようになります。
5. Random.bytes
ランダムなバイト列が必要な場合のために、Ruby 2.6ではRandomクラスに新しいbytesメソッドが追加されました。
使用例:
Random.bytes(10) # "\xCD\r\xE6Wz\xBA)\x02\xC4\xDB"
実はこの機能自体は完全に新しいものではなく、これまでsecurerandomモジュールでも同じことが実現できました。
require 'securerandom' SecureRandom.bytes(10)
では、なぜ新しいメソッドが必要なのでしょうか?
Random.bytesはセキュリティよりも速度を優先した設計になっており、SecureRandomの約8倍高速です。暗号学的な安全性が不要な場面でのランダムデータ生成に適しています。
6. Range#%
Ruby 2.6では、Rangeクラスに新しい%メソッドが追加されました。
例:
((0..) % 2).take(5) # [0, 2, 4, 6, 8]
このメソッドはRange#stepと同等の働きをするショートカットです。
7. TracePoint#parameters
TracePointクラスは、メソッド呼び出し、クラス定義、スレッドなどのイベントをトレースするための仕組みです。
Ruby 2.6では、新しいparametersメソッドが追加されました。
このメソッドを使うと、呼び出されたメソッドのパラメータ一覧を出力できます。
例:
TracePoint.trace(:call, :b_call, :c_call) do |tp| p [tp.event, tp.parameters] end def orange(a,b,c*) end orange(1,2,3)
実行結果:
[:call, [[:req, :a], [:req, :b], [:rest, :c]]]
デバッグツールやプロファイラの開発において、メソッドの引数情報を取得したいケースで役立つ機能です。
8. Transient Heap(トランジェントヒープ)
Transient Heapは、短命なオブジェクトに対するパフォーマンス改善であり、メモリ断片化の問題やmalloc呼び出しの遅さを軽減することを目的としています。
mallocとは、Rubyインタプリタ(および多くのCプログラム)がOSからメモリを確保するために使う仕組みです。
公式のNEWSエントリーによると、6〜7%程度の高速化が見込めるということです。
実際にベンチマークを実行してみたところ、この改善が最も効果を発揮するのは、10要素未満の小さなハッシュを大量に生成する場合のようです。

一方、この結果によれば、大きなハッシュについてはRuby 2.6(preview 3)の方がむしろ遅くなっています。
Transient Heapの恩恵を受けられるその他のオブジェクトは以下の通りです。
- Array(配列)
- Struct
- 通常のオブジェクト(自分で作成したクラスのインスタンス)
9. Array#union と Array#difference
Ruby 2.6では、Arrayクラスにunionとdifferenceという2つの新しいメソッドが追加されました。
例:
[1,2,3,4,5].difference([3]) # [1, 2, 4, 5] [1,2,3,4,5].union([5,6,7]) # [1, 2, 3, 4, 5, 6, 7]
どちらのメソッドも複数の引数を受け取れるため、複数の配列を一度に処理できます。
まとめ
Ruby 2.6には、より良いコードをより短い時間で書くための便利な新機能が数多く搭載されています。もうひとつのパフォーマンス関連の大型新機能であるMJIT(Method Based Just-in-Time Compiler)については、専用の記事で詳しく解説する予定です。
Ruby 2.6は2018年12月25日にリリースされる予定です。
最新情報をキャッチアップし、Rubyスキルを磨いてワンランク上のRuby開発者を目指したい方は、ぜひニュースレターにご登録ください。
最後までお読みいただきありがとうございました!
-
SQL Server 2017の新機能を徹底解説:DBAが知っておくべき主要な変更点
SQL Serverをより新しいバージョンにアップグレードすることを検討していますか?SQL Server 2016とSQL Server 2017のどちらを選ぶか迷っているのであれば、本記事で解説する理由から、SQL Server 2017へのアップグレードをおすすめします。 SQL Serverの新バージョンのリリースは、データベース管理者や開発者にとって興味深い新機能の宝庫です。SQL Server vNext(一般にSQL Server 2017と呼ばれます)のCommunity Technology Preview(CTP)2.0も例外ではありません。既存の機能やサービスには数多くの
-
Windows 8.1 Update 1の新機能徹底解説|タスクバー・マウス操作・起動設定の変更点
Microsoftは、4月8日に配信開始されるWindows 8.1 Update 1の詳細を発表しました。主な新機能として、タスクバーの強化、スマートなマウス操作の調整、そしてマウスとキーボードユーザーに配慮したスタート画面の改良などが含まれています。 第1部:Windows 8.1の主要アップデート内容 1. タスクバーへのModernアプリの表示 Windowsストアアプリ(Modernアプリ)をデスクトップのタスクバーにピン留めできるようになりました。長年Windowsを使い続けてきたユーザーの間では賛否が分かれるかもしれませんが、これはタブレット向けのストアアプリをデスクトップ