zenet_logo

-株式会社ゼネット技術ブログ-

Ruby 4.0 でトップレベルモジュール `Ruby` が定義された話

はじめに

ゼネットの土屋です。
Ruby 4.0 の変更点を眺めていたところ、少し地味ですが気になる変更を見つけました。
それが トップレベルモジュール Ruby が定義されたという点です。

www.ruby-lang.org

一見すると「名前空間が 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 の整理
  • 既存コードへの影響は小さいが、独自定義には注意が必要。

参考