Posted by naruse on 18 Dec 2025
Ruby 4.0.0-preview3 が公開されました。
言語仕様の変更
-
*nilはnil.to_aを呼び出さなくなりました。これは**nilがnil.to_hashを呼び出さないのと同様です。 [Feature #21047] -
行頭の論理二項演算子 (
||,&&,and,or) は、fluent dot(行頭のドット)のように前の行からの継続として扱われるようになりました。 以下の2つのコードは等価です:if condition1 && condition2 ... endif condition1 && condition2 ... end
組み込みクラスの更新
注: 重要なクラスの更新のみを記載しています。
-
Kernel
-
Kernel#inspectは#instance_variables_to_inspectメソッドの存在を確認するようになり、#inspectの文字列に表示するインスタンス変数を制御できるようになりました:class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
先頭に
|を付けたKernel#openによるプロセス生成という非推奨の挙動が削除されました。 [Feature #19630]
-
-
Binding
Binding#local_variablesにナンバードパラメーターが含まれなくなりました。また、Binding#local_variable_getとBinding#local_variable_setはナンバードパラメーターの操作を拒否するようになりました。 [Bug #21049]
-
File
- カーネルとファイルシステムがサポートしている場合、Linux 上で statx システムコールを通じて
File::Stat#birthtimeが利用可能になりました。 [Feature #21205]
- カーネルとファイルシステムがサポートしている場合、Linux 上で statx システムコールを通じて
-
IO
IO.selectがタイムアウト引数としてFloat::INFINITYを受け付けるようになりました。[Feature #20610]- 先頭に
|を付けたIOクラスメソッドによるプロセス生成という非推奨の挙動が削除されました。 [Feature #19630]
-
Math
Math.log1pとMath.expm1が追加されました。 [Feature #21527]
-
Method
Method#source_location、Proc#source_location、UnboundMethod#source_locationは、[path, start_line, start_column, end_line, end_column]の5つの要素を持つ拡張された位置情報を返すようになりました。従来の[path, line]という2要素の形式は、結果に対して.take(2)を呼び出すことで取得できます。 [Feature #6012]
-
Proc
Proc#parametersは、匿名のオプション引数が必須の場合との整合性をとるため、[:opt, nil]ではなく[:opt]として表示するようになりました。 [Bug #20974]
-
Ractor
-
Ractor 間で通信するための新しい同期メカニズムとして
Ractor::Portクラスが追加されました。 [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Portは以下のメソッドを提供します:Ractor::Port#receiveRactor::Port#send(またはRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
結果として、
Ractor.yieldとRactor#takeは削除されました。 - Ractor の終了を待機するために
Ractor#joinとRactor#valueが追加されました。これらはThread#joinやThread#valueと同様です。 Ractor#joinを実装するために内部で使用される低レベルインターフェースとしてRactor#monitorとRactor#unmonitorが追加されました。Ractor.selectは Ractor と Port のみを受け付けるようになりました。Ractor が渡された場合、その Ractor が終了した時点で戻ります。Ractor#default_portが追加されました。各Ractorはデフォルトのポートを持っており、Ractor.sendやRactor.receiveで使用されます。Ractor#close_incomingとRactor#close_outgoingは削除されました。- 共有可能な Proc や lambda を作成するために
Ractor.shareable_procとRactor.shareable_lambdaが導入されました。 [Feature #21550], [Feature #21557]
-
-
Range
Range#to_setとEnumerator#to_setは、無限範囲 (endless ranges) による問題を防ぐためにサイズチェックを行うようになりました。 [Bug #21654]Range#overlap?が無限範囲 (unbounded ranges) を正しく扱えるようになりました。[Bug #21185]- 始端のない (beginless) 整数範囲に対する
Range#maxの挙動が修正されました。 [Bug #21174] [Bug #21175]
-
Ruby
- Ruby 関連の定数を含むトップレベルモジュール
Rubyが定義されました。このモジュールは Ruby 3.4 で予約されていましたが、今回正式に定義されました。 [Feature #20884]
- Ruby 関連の定数を含むトップレベルモジュール
-
Ruby::Box
- 定義の分離を提供するための新しい (実験的な) 機能です。”Ruby Box” の詳細については、doc/language/box.md を参照してください。 [Feature #21311] [Misc #21385]
-
Set
Setは autoload される標準ライブラリのクラスではなく、組み込みクラス (core class) になりました。 [Feature #21216]Set#inspectは、Set[]構文 (例:#<Set: {1, 2, 3}>ではなくSet[1, 2, 3]) を使用した、evalに適した文字列を返すようになりました。これにより、Array や Hash のような他の組み込みコレクションクラスと一貫性が保たれます。 [Feature #21389]Set#to_setおよびEnumerable#to_setに引数を渡すことは非推奨となりました。 [Feature #21390]
-
Socket
Socket.tcpとTCPSocket.newは、初期接続のタイムアウトを指定するためのopen_timeoutキーワード引数を受け付けるようになりました。 [Feature #21347]
-
String
- Unicode バージョン 17.0.0 および Emoji バージョン 17.0 に更新されました。 [Feature #19908][Feature #20724][Feature #21275] (Regexp にも適用されます)
String#strip,strip!,lstrip,lstrip!,rstrip,rstrip!が拡張され、*selectors引数を受け付けるようになりました。 [[Feature #21552]]
-
Thread
Kernel#raiseと同様のThread#raise(cause:)引数のサポートが導入されました。 [Feature #21360]
-
Fiber
Kernel#raiseと同様のFiber#raise(cause:)引数のサポートが導入されました。 [Feature #21360]
-
Fiber::Scheduler
- 指定された例外で Fiber に割り込みをかけるための
Fiber::Scheduler#fiber_interruptが導入されました。当初のユースケースは、ブロックしている IO 操作が閉じられた際に、その IO 操作待ちをしている Fiber に割り込むことです。 [Feature #21166]
- 指定された例外で Fiber に割り込みをかけるための
-
Pathname
- Pathname は default gem から Ruby の組み込みクラスに昇格しました。 [Feature #17473]
標準ライブラリの更新
以下の bundled gems は default gems から昇格しました。
- ostruct 0.6.3
- pstore 0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 6.17.0
- win32ole 1.9.2
- irb 1.15.3
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
注目すべき機能変更があった標準ライブラリの変更のみを記載しています。
その他の変更は以下のセクションに記載されています。また、GitHub Releases があるものについては、以前のバンドルバージョン(Ruby 3.3.0)からのリリース履歴もリストアップしています。
以下の default gem が追加されました。
- win32-registry 0.1.2
以下の default gems が更新されました。
- RubyGems 4.0.1
- bundler 4.0.1
- date 3.5.1
- digest 3.2.1
- english 0.8.1
- erb 6.0.0
- etc 1.4.6
- fcntl 1.3.0
- fileutils 1.8.0
- forwardable 1.4.0
- io-console 0.8.1
- io-nonblock 0.3.2
- io-wait 0.4.0.dev
- ipaddr 1.2.8
- json 2.17.1
- net-http 0.8.0
- openssl 4.0.0.pre
- optparse 0.8.1
- pp 0.6.3
- prism 1.6.0
- psych 5.3.0
- resolv 0.7.0
- stringio 3.1.9.dev
- strscan 3.1.6.dev
- timeout 0.5.0
- uri 1.1.1
- weakref 0.1.4
- zlib 3.2.2
以下の bundled gems が更新されました。
- minitest 5.26.2
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.3
- rexml 3.4.4
- net-ftp 0.3.9
- net-imap 0.5.12
- net-smtp 0.5.1
- matrix 0.4.3
- prime 0.1.4
- rbs 3.9.5
- typeprof 0.31.0
- debug 1.11.0
- base64 0.3.0
- bigdecimal 3.3.1
- drb 2.2.3
- syslog 0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
サポートされているプラットフォーム
-
Windows
- MSVC のバージョン 14.0 (_MSC_VER 1900) より前のサポートを終了しました。 これは、Visual Studio 2015 以降が必要になったことを意味します。
互換性の問題
-
Ractor::Portの追加に伴い、以下のメソッドが Ractor から削除されました:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoging
-
ObjectSpace._id2refは非推奨になりました。 [Feature #15408] -
Process::Status#&およびProcess::Status#>>は削除されました。 これらは Ruby 3.3 で非推奨になっていました。 [Bug #19868] -
rb_path_checkは削除されました。この関数は Ruby 2.7 で削除された$SAFEパスのチェックに使用されており、既に非推奨となっていました。 [Feature #20971]
標準ライブラリの互換性の問題
-
CGI ライブラリは default gems から削除されました。現在は以下のメソッドのために
cgi/escapeのみを提供しています:CGI.escapeとCGI.unescapeCGI.escapeHTMLとCGI.unescapeHTMLCGI.escapeURIComponentとCGI.unescapeURIComponentCGI.escapeElementとCGI.unescapeElement
-
Setが標準ライブラリから組み込みクラスへ移行したことに伴い、set/sorted_set.rbは削除され、SortedSetは autoload される定数ではなくなりました。SortedSetを使用するにはsorted_setgem をインストールし、require 'sorted_set'を行ってください。 [Feature #21287]
C API の更新
-
IO
rb_thread_fd_closeは非推奨となり、何もしなくなりました (no-op)。C 拡張から Ruby コードにファイルディスクリプタを公開する必要がある場合は、RUBY_IO_MODE_EXTERNALを使用してIOインスタンスを作成し、それを閉じるためにrb_io_close(io)を使用してください(これはIOインスタンス上のすべての保留中の操作を中断し、待機します)。ファイルディスクリプタを直接閉じると、保留中の操作は中断されず、未定義の動作につながる可能性があります。言い換えれば、2つのIOオブジェクトが同じファイルディスクリプタを共有している場合、一方を閉じても他方には影響しません。 [Feature #18455]
-
GVL
rb_thread_call_with_gvlは GVL の有無にかかわらず動作するようになりました。 これにより、Gem はruby_thread_has_gvl_pのチェックを回避できます。 ただし、GVL には引き続き注意を払ってください。 [Feature #20750]
-
Set
-
Setのための C API が追加されました。以下の関数がサポートされています: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
実装の改善
Ractor
Ractor をより安定的かつ高性能で使いやすくするために、多くの作業が行われました。これらの改善により、Ractor の実装は実験的ステータスの脱却に近づいています。
- パフォーマンスの改善
- Frozen string とシンボルテーブルは内部的にロックフリーなハッシュセットを使用するようになりました
- メソッドキャッシュのルックアップは、ほとんどの場合ロックを回避します
- クラス(および geniv)インスタンス変数へのアクセスが高速化され、ロックを回避します
- オブジェクト割り当て時のキャッシュ競合が回避されるようになりました
object_idはほとんどの場合ロックを回避します
- バグ修正と安定性
- Ractor と Thread を組み合わせた際のデッドロックの可能性を修正しました
- Ractor 内での require と autoload に関する問題を修正しました
- Ractor 間でのエンコーディング/トランスコーディングの問題を修正しました
- GC 操作とメソッド無効化における競合状態を修正しました
- Ractor 開始後のプロセス fork に関する問題を修正しました
JIT
- ZJIT
- 実験的なメソッドベースの JIT コンパイラ を導入しました。
--zjitサポートを有効にするには、Rust 1.85.0 以降で Ruby をビルドしてください。 - Ruby 4.0.0 時点では、ZJIT はインタプリタより高速ですが、YJIT ほど高速ではありません。 ZJIT を試すことを推奨しますが、現時点では本番環境への導入は避けることをお勧めします。
- 私たちの目標は、Ruby 4.1 で ZJIT を YJIT よりも高速にし、本番環境で利用可能にすることです。
- 実験的なメソッドベースの JIT コンパイラ を導入しました。
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitはデフォルトビルドでは機能しなくなりました。configureで--enable-yjit=statsを指定して--yjit-statsを有効にしてください。- デフォルトの統計に
invalidate_everythingを追加しました。これは TracePoint によってすべてのコードが無効化されたときにインクリメントされます。
RubyVM::YJIT.enableにmem_size:とcall_threshold:オプションを追加しました。
- RJIT
--rjitは削除されました。サードパーティ JIT API の実装は ruby/rjit リポジトリに移動します。
その他の変更点
より詳細な情報は NEWS か commit logs を参照してください。
これらの変更により、Ruby 3.4.0から 3776 ファイルが変更され、 222800 行が追加され、 293617 行が削除されました!deletions(-)
Download
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz
SIZE: 23865890 SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0 SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz
SIZE: 17915004 SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99 SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6 SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip
SIZE: 29403010 SHA1: 689cb6c497afb96d26745708e772b63afca52e1a SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
What is Ruby
Rubyはまつもとゆきひろ (Matz) によって1993年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。Rubyは様々なプラットフォームで動き、世界中で、特にWebアプリケーション開発のために使われています。