Ruby 4.0:主な機能、リリースのハイライト、およびアップグレード ガイド
Ruby 4.0 はメジャー リリースであり、大きな互換性を破る変更によるものではなく、コミュニティの 30 周年を記念して Ruby 30 周年 (2025 年 12 月 25 日) にリリースされました。
Ruby が実際にはセマンティック バージョニングに従っていないことを知って驚きました!
代わりに、Matz (Ruby の作成者) は、変更に感銘を受けるとメジャー バージョンを増やします。このバージョンは Ruby の 30 周年を記念し、言語を拡張する機能を導入しています。

Ruby 4 にアップグレードする Rubyist にとって良いニュースは、アップグレードが比較的簡単に行えることです。 Ruby::Box のようないくつかの新機能があります と ZJIT 、同時実行性のいくつかの改善、およびほとんどの下位互換性のあるその他のいくつかの改良点。
Ruby 4 で何が変わったのか、そしてどのようにスムーズにアップグレードできるのかを詳しく見ていきましょう。
Ruby::Box? とは何ですか
Ruby 4.0 の最も興味深い実験的機能の 1 つは Ruby::Box です。 これにより、Ruby プロセス内に分離された名前空間または「コンテナ」(Docker コンテナと混同しないでください)が導入されます。
これは基本的に、Ruby プロセス内で孤立した Ruby の世界をスピンオフする方法です。新しい Ruby::Box を作成するとき 、その Box 内にロードするクラス、モジュール、グローバル変数、定数、さらには C 拡張機能も、その Box に制限されます。
これは言語レベルでの軽量仮想化のようなもので、各 Box が独自の状態を持ち、定義が他の Box やメイン環境に漏洩することはありません。
実験的なものであるため、荒削りな点や不安定な点に遭遇する可能性があります。パフォーマンスのオーバーヘッドを考慮する必要があります。物事の隔離は無料ではないため、コアチームは意図的にオプトインにしました。
Ruby 4.0 の時点では、Box は真の並列実行をすぐに提供することを目的としていません。これらは、よりスマートなコード読み込みの基盤を築き、より意味のあるものに進化する可能性があります。 Ruby がこのように興味深い方法で進化するのを見るのが楽しみです。 Ruby Box を使用したい場合は、まず環境変数を有効にする必要があります。
RUBY_BOX=1
ZJIT が重要な理由
Ruby 4.0 では、YJIT の後継として開発された、まったく新しいジャストインタイム コンパイラである ZJIT が導入されています。数えてみると、MRI には現在2 つあります。 JIT コンパイラー。 ZJIT は YJIT とは異なり、並行して開発されています。すでに YJIT を使用している場合は、切り替える必要はありません。
YJIT の要約
YJIT (「Yet Another JIT」) は Shopify によって構築され、Ruby 3.1 で導入されました。これは、Lazy Basic Block Versioning アプローチを使用しており、コードの小さなチャンク (基本ブロック) をオンザフライでコンパイルし、ランタイム タイプに基づいて特殊化します。
YJIT は、追加が比較的簡単でありながら、多くの Ruby アプリを大幅に高速化することが証明されています。これは Rust で書かれており、最近の Ruby バージョンではデフォルト/プライマリ JIT となっています。
ZJIT との違い
ZJIT は、より伝統的なメソッドベースの JIT 戦略を採用しています。 ZJIT は、小さなブロックを少しずつコンパイルするのではなく、SSA (静的単一割り当て) 中間表現とより従来型のコンパイラ パイプラインを使用して、より大きな単位 (メソッド全体またはより大きなコード チャンク) をコンパイルします。
これは、「教科書」の JIT コンパイラに少し似たように設計されており、コントリビューターが理解し、改善しやすくなるはずです。
Ruby コア チームは、ZJIT の 2 つの目標を明確に述べています。それは、(YJIT よりも高度な最適化を可能にすることで) Ruby の長期的なパフォーマンスの上限を引き上げることと、コミュニティによる JIT のハッキングをさらに容易にすることです。
Ruby 4.0 で ZJIT を有効にする
ZJIT は利用可能ですが、Ruby 4.0 ではデフォルトで有効になっていません。
これを試すには、システムに Rust 1.85 以降がインストールされた Ruby をビルドする必要があります。 JIT コードは Ruby バイナリの一部ですが、それをビルドするには Rust が必要です。その後、「--zjit」フラグを指定して Ruby を実行し、ZJIT を使用できます。
JIT をデフォルトのままにしても、引き続き YJIT の恩恵を受けられます (YJIT 自体は改善され続けています)。 --rjit を使用していた場合 このフラグは、このリリースでは削除されていることがわかります。
Ruby 4 では Ractor がいくつか改善されています
Ruby 3.0 では、並列処理のための実験的な機能である Ractors が導入されました。 Ractor を使用すると、単一プロセスで複数の Ruby インタープリター (コードを実行するシステムの一部) を実行して、通常、Ruby を一度に 1 つのスレッドに制限する GIL (グローバル インタープリター ロック) を回避できます。私は Ractor を使用したことはありませんが、Ractor への継続的な投資は、Ractor が Ruby の将来にとって重要であることを明確に示しています。
Ruby 4.0 では、Ractor はまだあります。 実験的とマークされていますが、主流の使いやすさに近づけるためにいくつかの大きな改善と API の変更が加えられています。
Ractor を使用したことがある場合は、メッセージの送受信が少し面倒だったことをご存知でしょう。 Ruby 4.0 は、既存の API をより堅牢な Ractor::Port に置き換えます。 仕組み。 Ractor::Port は本質的に、Ractor が値を交換するために使用できるパイプまたはチャネルです。各 Ractor にはデフォルトのポート (Ractor.current.default_port) が設定されました。 )、カスタム Port オブジェクトを作成して渡すこともできます。
Ractor への変更は、いくつかの重大な変更があることも意味します。最も注目すべきは Ractor.yield です。 と Ractor#take
Ruby 4.0 の Ractor 実装は内部的に、パフォーマンスと安全性が向上するように調整されています。これらにより、Ractor 間の共有状態が減少しました。 Ractor 間での共有状態が少なくなると、誤って分離が解除される可能性が低くなり、マルチコア システムでの CPU キャッシュ使用率が向上します。
ラクターは、まだスレッドやプロセスほど広く使用されていませんが、スケーリングが向上し、実行速度が向上するはずです。
*.nil Ruby 4 の変更点
スプラッティング nil nil.to_a を呼び出さなくなりました Ruby 4.0 では。
古い Ruby バージョンでは、arr = [*nil] のようなことを実行します。 nil.to_a を呼び出します 舞台裏 ([] を返します) )、空の配列が得られます。これは少し魔法的で一貫性がありませんでした (なぜ *nil は 空の配列のように動作しますか?)。
Ruby 4.0 では、この奇妙な動作はなくなりました。スプラット (*) の使用 ) nil で しません to_a を呼び出します 。基本的には「飛びつくものは何もない」ものとして扱われます。この変更により、ダブルスプラット **nil の動作と一貫性が保たれます。 nil.to_hash を呼び出しません 、Ruby 3.4 で導入されました。
Ruby 4 の行頭の論理演算子
これは、多くの Rubyist を笑顔にする、かなり小さな構文の改善です。
&& を入力できるようになりました。 、|| 、and 、または or 最初に 行の を使用して、前の行からのブール式を継続します。たとえば、次のように記述できます。
if user_signed_in?
&& user.admin?
&& feature_enabled?
perform_admin_task
end
これは
と同じです。if user_signed_in? &&
user.admin? &&
feature_enabled?
perform_admin_task
end
これらがすでに同じではなかったのは少し奇妙ですが、このアップデートには満足しています。
Ruby 4 の一部のクラスの更新
Ruby 4.0 には、コア クラスに対するいくつかの小さな変更と改善も含まれています。
まず、Set class は組み込みコアクラスになりました。つまり、require 'set' なしで使用できるようになります。 。これは set/sorted_set.rb の削除に伴い行われます。 .
同じことが Pathname にも当てはまります。 、コア クラスに昇格しました。
新しい Array もいくつかあります 方法!このリリースでは、Array#find のパフォーマンスが向上しています。 、単純な線形検索よりもインテリジェントに配列を検索します。 Array#rfind も導入されました。 - それはタイプミスではありません!このメソッドは条件に一致する最後の要素を検索します。
Ruby 4 では、いくつかの新しい数学メソッド、イントロスペクション コントロール、Enumerator も追加されました。 改善点などなど!改善点の完全なリストについては、公式ドキュメントを必ずチェックしてください。
Ruby 4 にアップグレードする方法
実稼働アプリでの Ruby バージョンのアップグレードは常に注意して行う必要がありますが、Ruby 3.4 から使用している場合はこれが最も簡単なアップグレードの 1 つであるはずです。
安全に移行するためのヒントをいくつか紹介します。
リリースノート
まず、公式リリースノートを読んでください。公式の非推奨通知を再確認してください。そんなべきではない ここで驚かれることはありません。 Ruby 3.4 では、今後の非推奨について警告するはずです。
非推奨の警告
Ruby インタープリターからの非推奨の警告を無視した場合は、言語を更新する前にそれらの警告に対処してください。
ベースライン テスト
次に、テストが適切であることを確認してください。これにより、アプリの動作が変わっていないという確信を得ることができます。 何も持っていない場合 少なくともクリティカル パスをカバーするために、今がテストに投資する絶好の機会です。
バンドラーを更新
次にバンドラーを更新することをお勧めします。最新バージョンを使用したら、bundle install を実行します。 エラーや警告がないか確認してください。
Ruby のバージョンを増やす
これで、Ruby の新しいバージョンをインストールして切り替えることができます。 rbenv のような Ruby バージョン マネージャー または asdf Ruby の世界ではローカル バージョンを制御するためによく使われています。アプリが Docker で実行される場合は、Dockerfile 内の Ruby バージョンを更新する必要があります。アプリが Docker なしのプラットフォームで実行される場合は、そこで Ruby のバージョンを更新する必要があります。
Gemfile で Ruby 4.0 にアップグレードします
Gemfile 内の Ruby バージョンを更新します (ruby でロックしている場合) ディレクティブ) を実行し、bundle install を実行します。 最後にもう一度。
テストを実行する
最後に、テストを実行します。何も壊れていない場合は、アプリケーション内の重要なパスを必ず実行して、さらに信頼性を高めてください。アップグレードを出荷する前に、Honeybadger のような例外監視サービスの使用を検討して、実際にそれを知るようにしてください。 Ruby 4 へのアップグレードがユーザーに問題を引き起こしている場合。
これらの手順に従えば、Ruby が提供する最新の情報を比較的簡単に得ることができるはずです。これらのテストを実行するときは、Ruby の 30 歳の誕生日を祝うことを忘れないでください。
-
Ruby Mapメソッドの使用方法(例付き)
Mapは、配列、ハッシュ、範囲で使用できるRubyメソッドです。 マップの主な用途は、データを変換することです。 例 : 文字列の配列が与えられた場合、すべての文字列に目を通し、すべての文字を大文字にすることができます。 または、Userのリストがある場合 オブジェクト… 変換できます 対応するメールアドレス、電話番号、またはその他の属性のリストにそれらを追加します Userで定義 クラス。 これを行う方法を正確に見てみましょう! ルビーマップ構文 マップの構文は次のようになります: array = [a, b, c] array.map { |string| string.
-
AppSignal が Alpine Linux ARM をサポート:安心してサーバーを監視
本日、Alpine Linux を実行するマシンの ARM サポートを開始します。この機能は、Ruby および Elixir ユーザーが利用できます。将来的には、Node.js パッケージに Alpine Linux ARM のサポートを追加したいと考えています。 ARM CPU アーキテクチャはますます人気が高まっています。これは開発マシンや運用サーバーに電力を供給するため、サポートするオペレーティング システムのリストにこれを追加することにしました。 インストール手順 以前と同じ方法でパッケージをインストールできます。 ARM マシンは自動的に検出され、一致する拡張機能とエージェントが