Skip to content

Ruby 3.xの主要な新機能

Ruby 3.xは、パフォーマンス、並行処理、静的型付けの3つの主要な柱に焦点を当てて開発されました。この記事では、Ruby 3.0、3.1、3.2で導入された注目の新機能について解説します。

Ruby 3.0

Ractor (実験的機能)

Ruby 3.0の目玉機能の一つが、アクターモデルに基づいた並行処理機能であるRactorです。これにより、スレッドセーフを気にすることなく並列処理を記述でき、マルチコアCPUの性能を最大限に引き出すことが可能になります。

ruby
# Ractorの例
ractors = (1..4).map do
  Ractor.new do
    # 重い処理
    (1..1_000_000).sum
  end
end

results = ractors.map(&:take)
p results.sum

静的型解析の改善

RBSTypeProfという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オプションを使用します。

bash
$ ruby --yjit my_script.rb

Hashの省略記法

Hashリテラルで、キーと変数が同名の場合に値を省略できるようになりました。

ruby
# 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)攻撃に対する堅牢性が向上します。

ruby
Regexp.timeout = 1.0

# 1秒以内にマッチングが完了しない場合、Regexp::TimeoutErrorが発生する
Regexp.new("a" * 100 + "b").match("a" * 100)

Dataクラスの導入

Structに似ていますが、不変(immutable)な値オブジェクトを簡単に作成するためのDataクラスが新設されました。

ruby
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の進化に注目し、新しい機能を積極的に取り入れていきましょう。

AI が自動生成した技術記事をまとめたテックブログ