このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
それぞれのエントリーは参照情報があるため短いです。十分な情報と共に書かれた全ての変更のリストはリンク先を参照してください。
言語仕様の変更
- ブロック引数を参照するための
itが追加されました。[feature#18980] frozen_string_literalコメントが付いていないファイルの文字列リテラルは、変更されると非推奨の警告を発するようになりました。 この警告は-W:deprecatedを指定するか、Warning[:deprecated] = trueを設定することで有効にできます。 この変更を無効にするには、コマンドライン引数--disable-frozen-string-literalを指定して Ruby を実行してください。[feature#20205]- String#+@ は、文字列を変更すると非推奨の警告が出るような場合には複製を返すようになりました。これは
str.dup if str.frozen?という書き方の代替として提供されています。
- String#+@ は、文字列を変更すると非推奨の警告が出るような場合には複製を返すようになりました。これは
- メソッド呼び出し時のキーワード引数として
**nilを渡すことがサポートされました。**nilは**{}と同様にキーワードを渡さないものとして扱われ、変換メソッドも呼び出されません。[bug#20064] - 添字代入でブロックを渡すことが禁止されました(例
a[0, &b] = 1)。[bug#19918] - 添字代入でキーワード引数を渡すことが禁止されました(例
a[0, kw: 1] = 2)。[bug#20218] - トップレベルの名前
::Rubyが予約されました。Warning[:deprecated]が有効な場合、この名前を定義すると警告が出ます。[feature#20884]
組み込みクラスの更新(注目すべきもののみ)
- Array
- 新規メソッド
- Array#fetch_values が追加されました。[feature#20702]
- 新規メソッド
- Exception
- 変更されたメソッド
- Exception#set_backtrace が Thread::Backtrace::Location の配列を受け取れるようになりました。Kernel.#raise、Thread#raise、Fiber#raise もこの新しい形式を受け取れるようになりました。[feature#13557]
- 変更されたメソッド
Fiber::Scheduler- ブロッキング操作をイベントループの外に移動できるようにする、省略可能なフック
Fiber::Scheduler#blocking_operation_waitが導入されました。これによりレイテンシが削減され、マルチコアプロセッサの利用率が向上します。[feature#20876]
- ブロッキング操作をイベントループの外に移動できるようにする、省略可能なフック
- GC
- 新規メソッド
- GC.config が追加されました。ガベージコレクタの設定変数を取得・変更できるようになりました。[feature#20443]
- GC の設定パラメータ
rgengc_allow_full_markが導入されました。falseを指定すると GC は若い世代のオブジェクトのみをマークするようになります。デフォルトはtrueです。[feature#20443]
- 新規メソッド
- Hash
- Hash.new が
capacity:という省略可能なキーワード引数を受け取るようになりました。あらかじめ指定した容量でハッシュを確保できるため、大きなハッシュを少しずつ組み立てる際に再確保やキーの再ハッシュ計算を省略でき、パフォーマンスが向上します。[feature#19236]
- Hash.new が
- IO::Buffer
- IO::Buffer#copy が GVL を解放できるようになり、コピー中に他のスレッドを実行できるようになりました。[feature#20902]
- Integer
- Integer#** は、戻り値が大きい場合に
Float::INFINITYを返していましたが、Integerを返すようになりました。戻り値が非常に大きい場合は例外が発生します。[feature#20811]
- Integer#** は、戻り値が大きい場合に
- MatchData
- 新規メソッド
- MatchData#bytebegin と MatchData#byteend が追加されました。[feature#20576]
- 新規メソッド
- Object
- 変更されたメソッド
- Object#singleton_method が、レシーバの特異クラスに prepend または include されたモジュールのメソッドも返すようになりました。[bug#20620]
o = Object.new o.extend(Module.new{def a = 1}) o.singleton_method(:a).call #=> 1
- Object#singleton_method が、レシーバの特異クラスに prepend または include されたモジュールのメソッドも返すようになりました。[bug#20620]
- 変更されたメソッド
- Ractor
- Ractor の中で
requireが許可されるようになりました。require の処理自体は main Ractor 上で実行されます。 require の処理を main Ractor 上で実行するためのRactor._require(feature)が追加されました。 [feature#20627] - 新規メソッド
- Ractor.main? が追加されました。[feature#20627]
- 現在の Ractor の Ractor-local storage にアクセスするための
Ractor.[]とRactor.[]=が追加されました。[feature#20715] - Ractor ローカル変数をスレッドセーフに初期化するための Ractor.store_if_absent が追加されました。ブロックを渡すと、key に対応するデータがない場合にブロックの評価結果を格納します。[feature#20875]
- Ractor の中で
- Range
- 変更されたメソッド
- Range#size は、範囲が反復可能でない場合に
TypeErrorを発生するようになりました。[misc#18984] - Range#step は、数値だけでなくすべての型に対して
+演算子を使って反復するという、一貫した意味論を持つようになりました。[feature#18368](Time.utc(2022, 2, 24)..).step(24*60*60).take(3) #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC]
- Range#size は、範囲が反復可能でない場合に
- 変更されたメソッド
- Rational
- Rational#** は、戻り値の分子が大きい場合に
Float::INFINITYまたはFloat::NANを返していましたが、Rationalを返すようになりました。非常に大きい場合は例外が発生します。[feature#20811]
- Rational#** は、戻り値の分子が大きい場合に
- RubyVM::AbstractSyntaxTree
- AST ノードに関連付けられた位置情報オブジェクトを返す
RubyVM::AbstractSyntaxTree::Node#locationsメソッドが追加されました。[feature#20624] - 位置情報を保持する
RubyVM::AbstractSyntaxTree::Locationクラスが追加されました。[feature#20624]
- AST ノードに関連付けられた位置情報オブジェクトを返す
- String
- 新規メソッド
- String#append_as_bytes が追加されました。バイナリバッファやプロトコルをより簡単かつ効率的に扱うためのメソッドで、エンコーディングの検証や変換を一切行わずに引数をそのまま文字列に連結します。[feature#20594]
- 新規メソッド
- Symbol
- Symbol#to_s が返す文字列は、変更されると非推奨の警告を発するようになり、将来のバージョンで freeze される予定です。
この警告は
-W:deprecatedを指定するか、Warning[:deprecated] = trueを設定することで有効にできます。[feature#20350]
- Symbol#to_s が返す文字列は、変更されると非推奨の警告を発するようになり、将来のバージョンで freeze される予定です。
この警告は
- Time
- Windows において、Time#zone はシステムのタイムゾーン名に非 ASCII 文字が含まれる場合、アクティブなコードページの代わりに UTF-8 でエンコードするようになりました。[bug#20929]
- Time#xmlschema とそのエイリアスである Time#iso8601 は、以前は
timeライブラリによって提供される拡張メソッドでしたが、コアのTimeクラスに移動しました。[feature#20707]
- Warning
- 新規メソッド
- 可能な警告カテゴリの一覧を返す Warning.categories が追加されました。[feature#20293]
- 新規メソッド
標準添付ライブラリの更新(機能追加とバグ修正を除く)
- RubyGems
gem pushに--attestationオプションが追加されました。ビルド成果物の署名を sigstore.dev に保存できるようになります。
- Bundler
- フレッシュな lockfile にチェックサムを含めるための
lockfile_checksums設定が追加されました。 - 既存の lockfile にチェックサムを追加するための
bundle lock --add-checksumsが追加されました。
- フレッシュな lockfile にチェックサムを含めるための
- JSON
- パフォーマンスが改善され、JSON.#parse が json-2.7.x 系と比較して約 1.5 倍高速になりました。
- Tempfile
- Tempfile.create にキーワード引数
anonymous: trueが実装されました。Tempfile.create(anonymous: true)は作成したテンポラリファイルを即座に削除するため、アプリケーション側でファイルを削除する必要がなくなります。[feature#20497]
- Tempfile.create にキーワード引数
- win32/sspi.rb
- このライブラリは Ruby 本体のリポジトリから ruby/net-http-sspi へ切り出されました。[feature#20775]
- Socket
Socket::ResolutionErrorとSocket::ResolutionError#error_codeが追加されました。[feature#20018]
- IRB
- デフォルトで、型情報を用いた対話的メソッド補完が改善されました。[feature#20778]
これ以外の変更は以降の各節に記載しています。また、前回同梱されていたバージョン(Ruby 3.3.0)からの GitHub releases がある場合は、そのリリース履歴も記載しています。
以下の default gem が追加されました。
- win32-registry 0.1.0
以下の default gems が更新されました。
- RubyGems 3.6.2
- benchmark 0.4.0
- 0.3.0 から v0.4.0
- bundler 2.6.2
- date 3.4.1
- delegate 0.4.0
- 0.3.1 から v0.4.0
- did_you_mean 2.0.0
- 1.6.3 から v2.0.0
- digest 3.2.0
- 3.1.1 から v3.2.0.pre0, v3.2.0
- erb 4.0.4
- 4.0.3 から v4.0.4
- error_highlight 0.7.0
- 0.6.0 から v0.7.0
- etc 1.4.5
- fcntl 1.2.0
- 1.1.0 から v1.2.0
- fiddle 1.1.6
- fileutils 1.7.3
- 1.7.2 から v1.7.3
- io-console 0.8.0
- 0.7.1 から v0.7.2, v0.8.0.beta1, v0.8.0
- io-nonblock 0.3.1
- 0.3.0 から v0.3.1
- ipaddr 1.2.7
- 1.2.6 から v1.2.7
- irb 1.14.3
- json 2.9.1
- logger 1.6.4
- net-http 0.6.0
- open-uri 0.5.0
- 0.4.1 から v0.5.0
- optparse 0.6.0
- ostruct 0.6.1
- 0.6.0 から v0.6.1
- pathname 0.4.0
- 0.3.0 から v0.4.0
- pp 0.6.2
- prism 1.2.0
- pstore 0.1.4
- 0.1.3 から v0.1.4
- psych 5.2.2
- 5.1.2 から v5.2.0.beta1, v5.2.0.beta2, v5.2.0.beta3, v5.2.0.beta4, v5.2.0.beta5, v5.2.0.beta6, v5.2.0.beta7, v5.2.0, v5.2.1, v5.2.2
- rdoc 6.10.0
- reline 0.6.0
- resolv 0.6.0
- securerandom 0.4.1
- set 1.1.1
- 1.1.0 から v1.1.1
- shellwords 0.2.2
- singleton 0.3.0
- 0.2.0 から v0.3.0
- stringio 3.1.2
- strscan 3.1.2
- syntax_suggest 2.0.2
- tempfile 0.3.1
- time 0.4.1
- timeout 0.4.3
- tmpdir 0.3.1
- uri 1.0.2
- win32ole 1.9.1
- yaml 0.4.0
- 0.3.0 から v0.4.0
- zlib 3.2.1
以下の bundled gem が追加されました。
- repl_type_completor 0.1.9
以下の bundled gems が更新されました。
- minitest 5.25.4
- 5.20.0 から v5.25.4
- power_assert 2.0.5
- rake 13.2.1
- test-unit 3.6.7
- rexml 3.4.0
- rss 0.3.1
- 0.3.0 から 0.3.1
- net-ftp 0.3.8
- net-imap 0.5.4
- net-smtp 0.5.0
- prime 0.1.3
- 0.1.2 から v0.1.3
- rbs 3.8.0
- 3.4.0 から v3.4.1, v3.4.2, v3.4.3, v3.4.4, v3.5.0.pre.1, v3.5.0.pre.2, v3.5.0, v3.5.1, v3.5.2, v3.5.3, v3.6.0.dev.1, v3.6.0.pre.1, v3.6.0.pre.2, v3.6.0.pre.3, v3.6.0, v3.6.1, v3.7.0.dev.1, v3.7.0.pre.1, v3.7.0, v3.8.0.pre.1 v3.8.0
- typeprof 0.30.1
- 0.21.9 から v0.30.1
- debug 1.10.0
- racc 1.8.1
以下の gems が default gems から bundled gems に変更されました。
- mutex_m 0.3.0
- 0.2.0 から v0.3.0
- getoptlong 0.2.1
- base64 0.2.0
- bigdecimal 3.1.8
- observer 0.1.2
- abbrev 0.1.2
- resolv-replace 0.1.1
- rinda 0.2.0
- drb 2.2.1
- 2.2.0 から v2.2.1
- nkf 0.2.0
- 0.1.3 から v0.2.0
- syslog 0.2.0
- 0.1.2 から v0.2.0
- csv 3.3.2
互換性に関する変更
- エラーメッセージとバックトレースの表示が変更されました。
- 開始のクオートとして、バッククオートの代わりにシングルクオートが使われるようになりました。[feature#16495]
- クラス名がメソッド名の前に表示されるようになりました(クラスが恒久的な名前を持つ場合のみ)。[feature#19117]
rescue/ensureの余分なフレームがバックトレースに表示されなくなりました。[feature#20275]- Kernel.#caller、Thread::Backtrace::Location の各メソッドなども、これに合わせて変更されました。
変更前
変更後test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `<main>'test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>'
- Hash#inspect の表示が変更されました。[bug#20433]
- シンボルのキーは、モダンなシンボルキー記法で表示されるようになりました。
"{user: 1}" - それ以外のキーは
=>の前後にスペースが入るようになりました。'{"user" => 1}'(以前はスペースがなく'{"user"=>1}'でした)
- シンボルのキーは、モダンなシンボルキー記法で表示されるようになりました。
- Kernel.#Float が、小数点以下を省略した 10 進数文字列を受け付けるようになりました。[feature#20705]
Float("1.") # => 1.0 (これまでは ArgumentError が発生していました) Float("1.E-1") # => 0.1 (これまでは ArgumentError が発生していました) - String#to_f が、小数点以下を省略した 10 進数文字列を受け付けるようになりました。[feature#20705]
指数が指定された場合、結果が変わることに注意してください。
"1.".to_f # => 1.0 "1.E-1".to_f # => 0.1 (これまでは 1.0 が返っていました) Refinement#refined_classが削除されました。[feature#19714]
標準添付ライブラリの互換性に関する変更
- DidYouMean
DidYouMean::SPELL_CHECKERS[]=とDidYouMean::SPELL_CHECKERS.merge!が削除されました。
- Net::HTTP
- 以下の非推奨だった定数が削除されました。
Net::HTTP::ProxyModNet::NetPrivate::HTTPRequestNet::HTTPInformationCodeNet::HTTPSuccessCodeNet::HTTPRedirectionCodeNet::HTTPRetriableCodeNet::HTTPClientErrorCodeNet::HTTPFatalErrorCodeNet::HTTPServerErrorCodeNet::HTTPResponseReceiverNet::HTTPResponceReceiver
- これらの定数は 2012 年から非推奨でした。
- 以下の非推奨だった定数が削除されました。
- Timeout
- Timeout.#timeout が負の値を拒否するようになりました。[bug#20795]
- URI
- デフォルトのパーサが RFC 2396 準拠から RFC 3986 準拠に切り替わりました。[bug#19266]
C APIの変更
rb_newobjとrb_newobj_of(および対応するマクロRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF)が削除されました。[feature#20265]- 非推奨だった関数
rb_gc_force_recycleが削除されました。[feature#18290]
実装の改善
- デフォルトのパーサが Prism になりました。
従来のパーサを使うには、コマンドライン引数
--parser=parse.yを指定してください。[feature#20564] - IPv6 と IPv4 を並行して試すことでより速く信頼性の高い接続を実現するアルゴリズムである Happy Eyeballs version 2 ([RFC8305])が、Socket.tcp と TCPSocket.new で使われるようになりました。
グローバルに無効化するには、環境変数
RUBY_TCP_NO_FAST_FALLBACK=1を設定するか、Socket.tcp_fast_fallback=falseを呼び出してください。 メソッド単位で無効化するには、キーワード引数fast_fallback: falseを使用してください。[feature#20108] [feature#20782] - モジュラーガベージコレクタ (GC) 機能により、代替のガベージコレクタ (GC) 実装を動的にロードできるようになりました。
この機能を有効にするには、ビルド時に
--with-modular-gcを指定して Ruby を configure してください。 GC ライブラリは、実行時に環境変数RUBY_GC_LIBRARYを使ってロードできます。[feature#20351] - Ruby 組み込みのガベージコレクタは
gc/default/default.cという別ファイルに分離され、gc/gc_impl.hで定義された API を使って Ruby とやり取りするようになりました。 組み込みのガベージコレクタは、make modular-gc MODULAR_GC=defaultを使ってライブラリとしてビルドし、環境変数RUBY_GC_LIBRARY=defaultで有効にすることもできるようになりました。[feature#20470] - MMTk をベースにした実験的な GC ライブラリが提供されます。
この GC ライブラリは
make modular-gc MODULAR_GC=mmtkでビルドし、環境変数RUBY_GC_LIBRARY=mmtkで有効にできます。ビルドマシンに Rust ツールチェインが必要です。[feature#20860]
YJIT
新機能
- コマンドラインオプション
--yjit-mem-sizeにより、YJIT 全体のメモリ使用量を追跡する統一的なメモリ上限(デフォルト 128MiB)が導入されました。従来の--yjit-exec-mem-sizeオプションよりも直感的な指定方法です。--yjit-trace-exits=COUNTERにより、カウントされている exit やフォールバックをトレースできるようになりました。--yjit-perf=codegenにより、YJIT のコード生成関数に基づいた JIT コードのプロファイリングができるようになりました。--yjit-logにより、何がコンパイルされたかを追跡するコンパイルログを有効にできるようになりました。
- Ruby API
RubyVM::YJIT.enable(log: true)でもコンパイルログを有効にできるようになりました。RubyVM::YJIT.logで、実行時にコンパイルログの末尾を取得できるようになりました。
- YJIT の統計
RubyVM::YJIT.runtime_statsに、無効化(invalidation)・インライン化・メタデータエンコーディングに関する追加の統計が常に含まれるようになりました。- インライン化されなかった Ruby のメソッド呼び出しをプロファイルするための
RubyVM::YJIT.runtime_stats[:iseq_calls]が追加されました。 RubyVM::YJIT.runtime_stats[:cfunc_calls]は、パフォーマンスのため上位 20 件に切り詰められるようになりました。
新しい最適化
- コンテキストの圧縮により、YJIT のメタデータの保存に必要なメモリが削減されました
- ローカル変数と Ruby のメソッド引数のためにレジスタが割り当てられるようになりました
- YJIT が有効なとき、より多くの Core のプリミティブが Ruby で書かれたものに置き換えられて使われるようになりました
- Array#each、Array#select、Array#map が、パフォーマンス向上のため Ruby で書き直されました [feature#20182]
- 以下のような単純で自明なメソッドをインライン化できるようになりました
- 空のメソッド
- 定数を返すメソッド
- self を返すメソッド
- 引数をそのまま返すメソッド
- より多くの実行時メソッドに対して特殊化されたコード生成が行われます
- String#getbyte、String#setbyte、その他の文字列メソッドを最適化
- 低レベルのビット/バイト操作を高速化するためビット演算を最適化
- マルチ Ractor モードで shareable な定数をサポート
- その他様々な細かい最適化
その他の変更
- 渡されたブロックを使用しないメソッドにブロックを渡した場合、詳細表示モード(
-w)で警告が表示されるようになりました。 これに関連して、新しい警告カテゴリstrict_unused_blockが導入されました。-W:strict_unused_blockを指定するか、Warning[:strict_unused_block] = trueを設定することでこれらの警告を有効にできます。[feature#15554] - インタプリタや JIT によって特別に最適化されているいくつかのコアメソッド、例えば
String#freezeやInteger#+を再定義すると、performance カテゴリの警告(-W:performanceまたはWarning[:performance] = true)が発生するようになりました。[feature#20429]