
はじめに
ゼネットの土屋です。
Ruby 4.0 の変更点を眺めていたところ、少し地味ですが気になる変更を見つけました。
それが トップレベルモジュール Ruby が定義されたという点です。
一見すると「名前空間が 1 つ増えただけ」に見えますが、 果たして既存アプリケーションへの影響はどの程度あるのか、整理してみます。
これまでの Ruby の課題
Ruby には以前から、次のような定数がトップレベルに存在していました。
RUBY_VERSION RUBY_RELEASE_DATE RUBY_PLATFORM RUBY_PATCHLEVEL RUBY_REVISION RUBY_COPYRIGHT RUBY_ENGINE RUBY_ENGINE_VERSION RUBY_DESCRIPTION
これらは「Ruby 言語そのもの」や「処理系」に関する情報ですが、 明確に属する名前空間が存在しない状態でした。
Ruby 4.0 で導入された Ruby モジュール
Ruby 4.0 では、トップレベルに Ruby モジュールが正式に定義されました。
Ruby::VERSION
のように、Ruby 言語・処理系に関する情報をまとめるための名前空間として使われます。
Issue #20884 では、 「Ruby 言語そのもののための名前空間が必要だった」 という意図が明確に書かれています。
なぜ Ruby モジュールが必要だったのか
RubyVM に寄せたくなかった
処理系関連の API は、これまで RubyVM に置かれることがありました。
ただし RubyVM は事実上 CRuby 専用の名前空間です。
- JRuby
- TruffleRuby
といった他実装では使いにくくなってしまいます。
Ruby モジュール配下であれば、
処理系共通 API として定義しやすくなる、という狙いがあります。
トップレベルをこれ以上汚したくない
Ruby は長い歴史の中で、多くのトップレベル定数を抱えています。
これ以上増やすのではなく、
Ruby::VERSION Ruby::ENGINE
のように 整理された形で追加できるのは、 将来的にもメリットが大きいと感じました。
実行結果の比較
| 項目 | トップレベル定数 | Ruby モジュール |
値 |
|---|---|---|---|
| Ruby バージョン | RUBY_VERSION |
Ruby::VERSION |
"4.0.0" |
| リリース日 | RUBY_RELEASE_DATE |
Ruby::RELEASE_DATE |
"2025-12-18" |
| プラットフォーム | RUBY_PLATFORM |
Ruby::PLATFORM |
"x86_64-linux" |
| パッチレベル | RUBY_PATCHLEVEL |
Ruby::PATCHLEVEL |
-1 |
| リビジョン | RUBY_REVISION |
Ruby::REVISION |
"cfa3e7cf75531a8c90b39bbd9b977f30315b12e7" |
| 著作権表記 | RUBY_COPYRIGHT |
Ruby::COPYRIGHT |
"ruby - Copyright (C) 1993-2025 Yukihiro Matsumoto" |
| Ruby エンジン | RUBY_ENGINE |
Ruby::ENGINE |
"ruby" |
| エンジンバージョン | RUBY_ENGINE_VERSION |
Ruby::ENGINE_VERSION |
"4.0.0" |
| 詳細情報 | RUBY_DESCRIPTION |
Ruby::DESCRIPTION |
"ruby 4.0.0preview3 (2025-12-18 master cfa3e7cf75) +PRISM [x86_64-linux]" |
比較して分かること
- 値は完全に一致している。
- トップレベル定数は 今後も残り続ける。
既存コードへの影響は?
結論から言うと、ほとんどありません。
RUBY_VERSIONなどは引き続き使える。- 既存アプリケーションが壊れる変更ではない。
一方で注意点もあります。
module Ruby を自分で定義している場合
Ruby 3.4 以降では、次のようなコードは警告対象になっています。
module Ruby end
Ruby 4.0 では正式に Ruby が定義されるため、
確実に衝突します。
特に古い社内ライブラリや gem では、一度確認しておいた方がよさそうです。
まとめ
- Ruby 4.0 で
Rubyモジュールが正式に定義された。 - 目的は Ruby 言語・処理系 API の整理。
- 既存コードへの影響は小さいが、独自定義には注意が必要。
