このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
それぞれのエントリーは参照情報があるため短いです。十分な情報と共に書かれた全ての変更のリストはリンク先を参照してください。
言語仕様の変更
*nilは、**nilがnil.to_hashを呼ばないのと同様に、nil.to_aを呼ばなくなりました。[feature#21047]- 論理二項演算子(
||、&&、and、or)を行頭に置くことで、行頭の.と同様に前の行から継続できるようになりました。以下のコード例はいずれも同じ意味になります。
従来:if condition1 && condition2 # ... endif condition1 && condition2 # ... end
[feature#20925]if condition1 && condition2 # ... end
組み込みクラスの更新(注目すべきもののみ)
- Array
- 新規メソッド
array.reverse_each.findのより効率的な代替として Array#rfind が追加されました。[feature#21678]- Enumerable#find のより効率的なオーバーライドとして
Array#findが追加されました。[feature#21678]
- 新規メソッド
- Binding
- 変更されたメソッド
- Binding#local_variables が番号指定パラメータを含まなくなりました。また、Binding#local_variable_get、Binding#local_variable_set、Binding#local_variable_defined? は番号指定パラメータを扱おうとすると拒否するようになりました。[bug#21049]
- 新規メソッド
- 番号指定パラメータと
itパラメータにアクセスするための Binding#implicit_parameters、Binding#implicit_parameter_get、Binding#implicit_parameter_defined? が追加されました。[bug#21049]
- 番号指定パラメータと
- 変更されたメソッド
- Enumerator
- 変更されたメソッド
- Enumerator.produce がオプションの
sizeキーワード引数を受け取るようになりました。列挙子のサイズを指定するもので、整数、Float::INFINITY、呼び出し可能オブジェクト(ラムダなど)、またはサイズ不明を表すnilを指定できます。指定しなかった場合、サイズはデフォルトでFloat::INFINITYになります。
[feature#21701]# 無限の列挙子 enum = Enumerator.produce(1, size: Float::INFINITY, &:succ) enum.size # => Float::INFINITY # サイズが既知/計算可能な有限の列挙子 abs_dir = File.expand_path("./baz") # => "/foo/bar/baz" traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) { raise StopIteration if it == "/" File.dirname(it) } traverser.size # => 4
- Enumerator.produce がオプションの
- 変更されたメソッド
ErrorHighlight- ArgumentError が発生したとき、メソッド呼び出し側(caller)とメソッド定義側(callee)の両方のコードスニペットが表示されるようになりました。[feature#21543]
test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '<main>'
- ArgumentError が発生したとき、メソッド呼び出し側(caller)とメソッド定義側(callee)の両方のコードスニペットが表示されるようになりました。[feature#21543]
- Fiber
- 新規メソッド
- Kernel?.raise と同様の
cause:引数を Fiber#raise でサポートしました。[feature#21360]
- Kernel?.raise と同様の
- 新規メソッド
Fiber::Scheduler- 新規メソッド
- 指定した例外でファイバーを中断させるための
Fiber::Scheduler#fiber_interruptが導入されました。当初の想定用途は、ブロックする IO 操作を待っているファイバーが、その IO 操作のクローズによって中断されるようにすることです。[feature#21166] - シグナル例外が無効化されている場合でもファイバースケジューラが処理を継続できるようにする
Fiber::Scheduler#yieldが導入されました。[bug#21633] - 非同期の IO#close のための
Fiber::Scheduler#io_closeフックが再導入されました。 - IO の書き込みバッファをフラッシュする際に
Fiber::Scheduler#io_writeが呼び出されるようになりました。[bug#21789]
- 指定した例外でファイバーを中断させるための
- 新規メソッド
- File
- 新規メソッド
- カーネルとファイルシステムが対応していれば、Linux でも statx システムコールを介して File::Stat#birthtime が利用できるようになりました。[feature#21205]
- 新規メソッド
- IO
- 変更されたメソッド
- IO.select がタイムアウト引数として Float::INFINITY を受け取れるようになりました。[feature#20610]
- 非推奨だった、先頭に
|を付けた IO のクラスメソッドによるプロセス生成が削除されました。[feature#19630]
- 変更されたメソッド
- Kernel
- 変更されたメソッド
Kernel#inspectがinstance_variables_to_inspectというメソッドの存在を確認するようになり、これによって inspect の出力に含めるインスタンス変数を制御できるようになりました。
[feature#21219]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]
- 変更されたメソッド
- Math
- 新規メソッド
Math.log1pとMath.expm1が追加されました。[feature#21527]
- 新規メソッド
- Pathname
- Pathname が default gem から Ruby のコアクラスに昇格しました。[feature#17473]
- Proc
- 変更されたメソッド
- Proc#parameters が、匿名の必須引数の場合と表示が一貫するように、匿名のオプション引数を
[:opt, nil]ではなく[:opt]として表示するようになりました。[bug#20974]
- Proc#parameters が、匿名の必須引数の場合と表示が一貫するように、匿名のオプション引数を
- 変更されたメソッド
- Ractor
- Ractor 間で通信するための新しい同期機構として Ractor::Port クラスが追加されました。[feature#21262]
Ractor::Port は以下のメソッドを提供します。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, 12 - この結果、
Ractor.yieldとRactor#takeは削除されました。 - Ractor#join と Ractor#value が、Ractor の終了を待つために追加されました。それぞれ Thread#join、Thread#value に相当するものです。
- Ractor#monitor と Ractor#unmonitor が、Ractor#join を内部的に実装するために使われる低レベルのインターフェイスとして追加されました。
- Ractor.select は Ractor と Port のみを受け付けるようになりました。Ractor を渡した場合は、いずれかの Ractor が終了した時点で返るようになります。
- Ractor#default_port が追加されました。各 Ractor はデフォルトの port を持っており、Ractor#send や Ractor.receive に使われます。
Ractor#close_incomingとRactor#close_outgoingは削除されました。- shareable な Proc やラムダを作成するための Ractor.shareable_proc と Ractor.shareable_lambda が導入されました。[feature#21550] [feature#21557]
- Ractor 間で通信するための新しい同期機構として Ractor::Port クラスが追加されました。[feature#21262]
- Range
- 変更されたメソッド
Range#to_setが、終端のない(endless)範囲での問題を防ぐためのサイズチェックを行うようになりました。[bug#21654]- Range#overlap? が無限(範囲に境界がない)範囲を正しく扱うようになりました。[bug#21185]
- beginless な整数範囲における Range#max の挙動の不具合が修正されました。[bug#21174] [bug#21175]
- 変更されたメソッド
Ruby- Ruby に関連する定数を含む新しいトップレベルモジュール
Rubyが定義されました。このモジュールは Ruby 3.4 で予約されており、今回正式に定義されました。[feature#20884]
- Ruby に関連する定数を含む新しいトップレベルモジュール
Ruby::Box- 定義の分離を提供する(実験的な)新機能です。詳細は doc/language/box.md を参照してください。[feature#21311] [misc#21385]
- Set
- Set が、autoload される stdlib のクラスではなく、コアクラスになりました。[feature#21216]
- Set#inspect が、リテラル配列と同様のよりシンプルな表示を使うようになりました(例:
#<Set: {1, 2, 3}>ではなくSet[1, 2, 3])。[feature#21389] Set#to_setと Enumerable#to_set に引数を渡すことは非推奨になりました。[feature#21390]
- Socket
- Socket.tcp と TCPSocket.new が、最初の接続のタイムアウトを指定するための open_timeout キーワード引数を受け取るようになりました。[feature#21347]
- TCPSocket.new でユーザー指定のタイムアウトが発生した場合、状況によって Errno::ETIMEDOUT または IO::TimeoutError のいずれかが送出されることがありましたが、常に IO::TimeoutError が送出されるように統一されました。(なお Socket.tcp では、同様の状況で依然として Errno::ETIMEDOUT が発生する場合があり、また両方のケースにおいて OS レベルでタイムアウトが発生した場合には Errno::ETIMEDOUT が発生することがあります。)
- String
- Unicode のバージョンが 17.0.0 に、絵文字のバージョンが 17.0 に更新されました(これは正規表現にも適用されます)。[feature#19908] [feature#20724] [feature#21275]
- String#strip、String#strip!、String#lstrip、String#lstrip!、String#rstrip、String#rstrip! が
*selectors引数を受け取れるように拡張されました。[feature#21552]
- Thread
- 新規メソッド
- Kernel?.raise と同様の
cause:引数を Thread#raise でサポートしました。[feature#21360]
- Kernel?.raise と同様の
- 新規メソッド
標準添付ライブラリの更新(機能追加とバグ修正を除く)
注目すべき機能変更のみを挙げています。それ以外の変更は以降の各節に記載しています。また、前回同梱されていたバージョン(Ruby 3.4.0)からの GitHub releases がある場合は、そのリリース履歴も記載しています。
以下の gems が default gems から bundled gems に変更されました。
- ostruct 0.6.3
- pstore 0.2.0
- 0.1.4 から v0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 7.0.3
- win32ole 1.9.2
- 1.9.1 から v1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
以下の default gem が追加されました。
- win32-registry 0.1.2
以下の default gems が更新されました。
- RubyGems 4.0.3
- bundler 4.0.3
- date 3.5.1
- delegate 0.6.1
- digest 3.2.1
- 3.2.0 から v3.2.1
- english 0.8.1
- 0.8.0 から v0.8.1
- erb 6.0.1
- error_highlight 0.7.1
- etc 1.4.6
- fcntl 1.3.0
- 1.2.0 から v1.3.0
- fileutils 1.8.0
- 1.7.3 から v1.8.0
- forwardable 1.4.0
- 1.3.3 から v1.4.0
- io-console 0.8.2
- 0.8.1 から v0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- 0.3.2 から v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- 0.6.2 から v0.6.3
- prism 1.7.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- 0.4.1 から v0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- 0.1.3 から v0.1.4
- zlib 3.2.2
- 3.2.1 から v3.2.2
以下の bundled gems が更新されました。
- minitest 6.0.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.5
- rexml 3.4.4
- rss 0.3.2
- 0.3.1 から 0.3.2
- net-ftp 0.3.9
- 0.3.8 から v0.3.9
- net-imap 0.6.2
- net-smtp 0.5.1
- 0.5.0 から v0.5.1
- matrix 0.4.3
- 0.4.2 から v0.4.3
- prime 0.1.4
- 0.1.3 から v0.1.4
- rbs 3.10.0
- 3.8.0 から v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
- typeprof 0.31.1
- debug 1.11.1
- 1.11.0 から v1.11.1
- base64 0.3.0
- 0.2.0 から v0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- 2.2.1 から v2.2.3
- syslog 0.3.0
- 0.2.0 から v0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
- RubyGems と Bundler
- Ruby 4.0 には RubyGems と Bundler のバージョン 4 が同梱されました。詳細は以下のリンクを参照してください。
サポートプラットフォームの変更
- Windows
- MSVC 14.0(_MSC_VER 1900)より古いバージョンのサポートを終了しました。これにより Visual Studio 2015 以降が必要になりました。
互換性に関する変更
- Ractor::Port の追加に伴い、以下のメソッドが Ractor から削除されました。[feature#21262]
Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
- ObjectSpace?._id2ref が非推奨になりました。[feature#15408]
Process::Status#&とProcess::Status#>>が削除されました。これらは Ruby 3.3 で非推奨になっていました。[bug#19868]rb_path_checkが削除されました。この関数は Ruby 2.7 で削除された$SAFEのパスチェックに使われていたもので、既に非推奨でした。[feature#20971]- 「wrong number of arguments」の ArgumentError のバックトレースに、レシーバのクラス名またはモジュール名が含まれるようになりました(例えば単なる
barの中ではなくFoo#barの中、というように)。[bug#21698] - バックトレースに internal フレームが表示されなくなりました。これらのメソッドは、他の C で実装されたメソッドと同様に、あたかも Ruby のソースファイル中にあるかのように表示されるようになりました。[bug#20968]
変更前
変更後ruby -e '[1].fetch_values(42)' <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from <internal:array>:211:in 'block in Array#fetch_values' from <internal:array>:211:in 'Array#map!' from <internal:array>:211:in 'Array#fetch_values' from -e:1:in '<main>'$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '<main>'
標準添付ライブラリの互換性に関する変更
- cgi ライブラリが default gems から削除されました。現在は以下のメソッドのために
cgi/escapeのみを提供します。[feature#21258] - Set が stdlib からコアクラスに移動したことに伴い、
set/sorted_set.rbが削除され、SortedSetは autoload される定数ではなくなりました。SortedSetを使うには sorted_set gem をインストールしてrequire 'sorted_set'してください。[feature#21287] - Net::HTTP
- ヘッダで明示的に指定されなかった場合に、ボディを持つリクエスト(
POST、PUTなど)に対して自動的にContent-Typeヘッダをapplication/x-www-form-urlencodedに設定するデフォルトの挙動が削除されました。この自動設定に依存していたアプリケーションでは、これ以降Content-Typeヘッダなしでリクエストが送信されるようになり、特定のサーバーとの互換性が失われる可能性があります。(GH-net-http #205)
- ヘッダで明示的に指定されなかった場合に、ボディを持つリクエスト(
C APIの変更
- IO
rb_thread_fd_closeは非推奨となり、何もしない関数になりました。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
- Set のための C API が追加されました。以下のメソッドがサポートされています。[feature#21459]
実装の改善
- Class#new (例:
Object.new)が全てのケースでより高速になりましたが、特にキーワード引数を渡す場合に顕著です。この変更は YJIT と ZJIT にも統合されています。[feature#21254] - サイズプールごとの GC ヒープがそれぞれ独立して拡張するようになり、一部のプールにのみ長命なオブジェクトが存在する場合のメモリ使用量が削減されました。
- 大きなオブジェクトのページに対する GC のスイープが高速化されました。
- 「Generic ivar」オブジェクト(String、Array、
TypedDataなど)が、より高速なインスタンス変数アクセスのために新しい内部的な「fields」オブジェクトを使うようになりました。 - GC が、最初に使われるまで内部的な id2ref テーブルを保持しないようになり、object_id の確保と GC のスイープが高速になりました。
- Class や Module オブジェクトでの
object_idとhashが高速化されました。 - より大きな bignum の
Integerが、可変長アロケーション(variable width allocation)を使って埋め込まれたままになれるようになりました。 - Random、Enumerator::Product、Enumerator::Chain、Addrinfo、StringScanner や一部の内部オブジェクトが write-barrier protected になり、GC のオーバーヘッドが削減されました。
Ractor
Ractor をより安定して、高性能で、使いやすくするための多くの作業が行われました。これらの改善により、Ractor の実装は実験的なステータスを卒業することに近づいています。
- パフォーマンスの改善
- フリーズされた文字列とシンボルテーブルが、内部的にロックフリーなハッシュセットを使うようになりました。[feature#21268]
- メソッドキャッシュの検索が、ほとんどの場合でロックを回避するようになりました。
- クラス(および generic ivar)のインスタンス変数アクセスが高速化され、ロックを回避するようになりました。
- Ractor ごとのカウンタを使うことで、オブジェクト割り当て時の CPU キャッシュの競合を回避するようになりました。
- スレッドローカルなカウンタを使うことで、xmalloc/xfree での CPU キャッシュの競合を回避するようになりました。
object_idが、ほとんどの場合でロックを回避するようになりました。
- バグ修正と安定性
- Ractor と Thread を組み合わせた際に発生しうるデッドロックを修正しました。
- Ractor 内での require と autoload に関する問題を修正しました。
- Ractor をまたいだエンコーディング/トランスコーディングに関する問題を修正しました。
- GC の操作とメソッドの無効化におけるレースコンディションを修正しました。
- Ractor を開始した後にプロセスがフォークする際の問題を修正しました。
- Ractor 下での GC のアロケーションカウントが正確になりました。
- GC の後に TracePoint が動作しなくなる問題を修正しました。[bug#19112]
JIT
ZJIT
- 実験的なメソッド単位の JIT コンパイラが導入されました。利用可能な環境では、
--zjitオプションまたはRubyVM::ZJIT.enableの呼び出しによって実行時に ZJIT を有効化できます。ZJIT を有効にして Ruby をビルドするには Rust 1.85.0 以降が必要です。 - Ruby 4.0.0 の時点では、ZJIT はインタプリタよりも高速ですが、まだ YJIT ほどは高速ではありません。実験的に試すことは推奨しますが、現時点では本番環境への投入は推奨しません。
- 私たちの目標は、Ruby 4.1 で ZJIT を YJIT より高速かつ本番投入可能にすることです。
YJIT
- RubyVM::YJIT.runtime_stats
ratio_in_yjitはデフォルトビルドでは動作しなくなりました。--yjit-statsで有効にするには、configure で--enable-yjit=statsを指定してください。- TracePoint によって全てのコードが無効化された際にインクリメントされる
invalidate_everythingがデフォルトの統計に追加されました。
- RubyVM::YJIT.enable に
mem_size:とcall_threshold:オプションが追加されました。
RJIT
--rjitが削除されました。サードパーティ JIT API の実装は ruby/rjit リポジトリに移されます。