Ruby 3.xの主要な新機能
Ruby 3.xは、パフォーマンス、並行処理、静的型付けの3つの主要な柱に焦点を当てて開発されました。この記事では、Ruby 3.0、3.1、3.2で導入された注目の新機能について解説します。
Ruby 3.0
Ractor (実験的機能)
Ruby 3.0の目玉機能の一つが、アクターモデルに基づいた並行処理機能であるRactor
です。これにより、スレッドセーフを気にすることなく並列処理を記述でき、マルチコアCPUの性能を最大限に引き出すことが可能になります。
# Ractorの例
ractors = (1..4).map do
Ractor.new do
# 重い処理
(1..1_000_000).sum
end
end
results = ractors.map(&:take)
p results.sum
静的型解析の改善
RBS
とTypeProf
という2つのツールが導入され、Rubyの静的型解析が強化されました。
- RBS: Rubyプログラムの型を記述するための言語です。
- TypeProf: 型定義のないRubyコードからRBSを生成する型推論ツールです。
これにより、コードの品質と保守性が向上します。
その他の主要な変更点
- キーワード���数の分離: Ruby 2.7で非推奨とされた、通常の引数とキーワード引数の自動変換が完全に廃止されました。
Hash#except
:Hash
から指定したキーを除いた新しいハッシュを返すメソッドが追加されました。
Ruby 3.1
YJIT (実験的機能)
Shopifyによって開発された新しいJIT(Just-In-Time)コンパイラYJIT
が導入されました。従来のMJIT
に比べて高速化が期待されており、特にRailsアプリケーションのような大規模なプログラムで効果を発揮します。
YJITを有効にするには、--yjit
オプションを使用します。
$ ruby --yjit my_script.rb
Hash
の省略記法
Hash
リテラルで、キーと変数が同名の場合に値を省略できるようになりました。
# Ruby 3.0以前
x = 1
y = 2
h = { x: x, y: y } #=> { x: 1, y: 2 }
# Ruby 3.1以降
h = { x:, y: } #=> { x: 1, y: 2 }
Ruby 3.2
YJITの正式サポート
Ruby 3.1で実験的に導入されたYJITが、本番環境で利用可能なレベルに達し、正式にサポートされるようになりました。多くの改良が加えられ、さらなる高速化と安定性の向上が図られています。
Regexp
のタイムアウト機能
正規表現のマッチング処理が過度に長くなることを防ぐため、タイムアウト機能が追加されました。これにより、ReDoS(Regular Expression Denial of Service)攻撃に対する堅牢性が向上します。
Regexp.timeout = 1.0
# 1秒以内にマッチングが完了しない場合、Regexp::TimeoutErrorが発生する
Regexp.new("a" * 100 + "b").match("a" * 100)
Data
クラスの導入
Struct
に似ていますが、不変(immutable)な値オブジェクトを簡単に作成するためのData
クラスが新設されました。
Point = Data.define(:x, :y)
p = Point.new(1, 2)
p.x #=> 1
p.y #=> 2
p.x = 3 #=> NoMethodError (undefined method `x=' for #<data Point x=1, y=2>)
まとめ
Ruby 3.xは、パフォーマンスの向上、並行処理機能の導入、静的型解析の強化など、多くの重要な改善をもたらしました。これらの新機能を活用することで、より高速で堅牢、かつ保守性の高いRubyアプリケーションを開発することが可能になります。
今後もRubyの進化に注目し、新しい機能を積極的に取り入れていきましょう。