ruby-list
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- 21 discussions
Ruby 4.0.0 が公開されました。
Ruby 4.0 には "Ruby Box"、"ZJIT" ほか多数の改善が含まれています。
## Ruby Box
Ruby Boxはクラス等の定義の分離/隔離のための機能を提供する、実験的機能です。Ruby Boxは環境変数として
`RUBY_BOX=1` を指定することで有効化できます。クラス名は `Ruby::Box` です。
Boxの中で読み込まれた定義はそのBox内に閉じた状態となります。Ruby
Boxが隔離できる定義としては、既存クラスへのモンキーパッチ、グローバル変数やクラス変数の操作、クラスやモジュールの定義、そして.rbファイルや拡張ライブラリとして実装されたライブラリ類です。
Ruby Boxの主要なユースケースとしては、次のものが想定されています:
* テストのために何かの挙動を上書きするようなモンキーパッチを必要とするテストケースをBox内に閉じて実行すること
* WebアプリケーションをBox内で実行することで、Blue-Greenデプロイメントをプロセス内で、アプリケーションサーバ上で実行すること
* WebアプリケーションをBox内で実行することで、依存関係の更新時などに、一定期間並列で動かしてRubyコードを用いてレスポンス等を検証すること
* (未設計の)「パッケージAPI」のような新しい高レベルAPIを作るための低レベルAPIとしての機能を提供すること
"Ruby Box"の詳細については次のドキュメントを参照してください: [doc/language/box.md](doc/language/box.md).
[[Feature #21311]] [[Misc #21385]]
## ZJIT
ZJIT は、YJIT の次世代として開発された新しい just-in-time(JIT)コンパイラです。ZJIT サポート付きで Ruby
をビルドするには Rust 1.85.0 以降が必要で、--zjit を指定すると ZJIT が有効になります。
私たちが Ruby 向けに新しいコンパイラを開発しているのは、パフォーマンスの上限を引き上げ(より大きなコンパイル単位サイズと SSA IR
を導入)つつ、より一般的なデザインであるメソッドコンパイラにすることで、外部からの貢献を促進したいからです。詳しくは
[ブログ記事](https://railsatscale.com/2025-12-24-launch-zjit/) をご覧ください。
<!-- このブログ記事は 2025-12-24 9:00am UTC に自動公開されます。 -->
ZJITは通常の Ruby インタプリタより高速ですが、まだ YJIT ほど速くはありません。ZJIT
をぜひ試してみて欲しいですが、現時点では本番環境へのデプロイは控えたほうがよいかもしれません。Ruby 4.1 の ZJIT
にご期待ください。
## Ractor の改善
Ruby で簡単に並列処理を行うための Ractor に多くの改善がありました。まず、`Ractor::Port`
というクラスを加え、メッセージの送受信についのて問題を解決しました([ブログ記事](https://product.st.inc/entry/2025/06/24/110606))。また、`Ractor.shareable_proc`によって、ProcをRactor間で共有しやすくしました。
性能面では、多くのデータ構造を改善し、グローバルロックに対する競合が大幅に減少し、並列処理性能を向上しました。また、Ractor
間で共有するデータを減らすことで、並列実行時の CPU キャッシュの衝突を減らしました。
Ruby 3.0 で experimental feature として導入されましたが、来年くらいには experimental を取りたいと思っています。
## 言語仕様の変更
* `*nil` は `nil.to_a` を呼ばなくなりました。`**nil` が `nil.to_hash`
を呼ばないのと同様です。[[Feature #21047]]
* 行頭の論理二項演算子(`||`、`&&`、`and`、`or`)は、ドット記法のように前の行を継続するようになりました。次のコードは同等です。
```ruby
if condition1
&& condition2
...
end
```
従来の書き方:
```ruby
if condition1 && condition2
...
end
```
```ruby
if condition1 &&
condition2
...
end
```
[[Feature #20925]]
## コアクラスの更新
注: 特筆すべきクラス更新のみを記載しています。
* 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` です。
```ruby
# 無限列挙子
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
```
[[Feature #21701]]
* 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>'
```
* Fiber
* `Kernel#raise` と同様に `Fiber#raise(cause:)` 引数をサポートしました。[[Feature #21360]]
* Fiber::Scheduler
* 指定した例外でファイバを中断する `Fiber::Scheduler#fiber_interrupt`
を追加しました。初期用途は、IO 操作が閉じられたときにブロッキング IO を待っているファイバを中断することです。[[Feature
#21166]]
* シグナル例外が無効なときでもスケジューラが処理を続行できるよう、`Fiber::Scheduler#yield`
を追加しました。[[Bug #21633]]
* 非同期 `IO#close` 用の `Fiber::Scheduler#io_close` フックを再導入しました。
* IO 書き込みバッファを flush する際に `Fiber::Scheduler#io_write`
を呼び出すようになりました。[[Bug #21789]]
* File
* カーネルとファイルシステムが対応していれば、statx システムコール経由で Linux でも
`File::Stat#birthtime` が利用可能になりました。[[Feature #21205]]
* IO
* `IO.select` がタイムアウト引数として `Float::INFINITY`
を受け付けるようになりました。[[Feature #20610]]
* `|` で始まる `IO` クラスメソッドによるプロセス生成という非推奨挙動を削除しました。[[Feature #19630]]
* Kernel
* `Kernel#inspect` は `#instance_variables_to_inspect`
メソッドの有無を確認し、`#inspect` 文字列に表示するインスタンス変数を制御できるようになりました。
```ruby
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">
```
[[Feature #21219]]
* `|` で始まる `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]]
* Ractor
* Ractor 間の通信のための新しい同期機構として `Ractor::Port` クラスを追加しました。[[Feature #21262]]
```ruby
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::Port` は次のメソッドを提供します。
* `Ractor::Port#receive`
* `Ractor::Port#send`(または `Ractor::Port#<<`)
* `Ractor::Port#close`
* `Ractor::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` はデフォルトポートを持ち、`Ractor.send`、`Ractor.receive`
で使用されるようになりました (`Ractor#default_port` を追加)。
* `Ractor#close_incoming` と `Ractor#close_outgoing` は削除されました。
* 共有可能な Proc / lambda を作るために `Ractor.shareable_proc` と
`Ractor.shareable_lambda` を追加しました。[[Feature #21550]] [[Feature
#21557]]
* Range
* `Range#to_set` はサイズチェックを行うようになり、終端のない範囲での問題を防ぎます。[[Bug #21654]]
* `Range#overlap?` は無限(非境界)範囲を正しく扱うようになりました。[[Bug #21185]]
* 始点のない整数範囲での `Range#max` の挙動を修正しました。[[Bug #21174]] [[Bug #21175]]
* Ruby
* Ruby に関する定数を含む新しいトップレベルモジュール `Ruby` を定義しました。このモジュールは Ruby 3.4
で予約されており、今回正式に定義されました。[[Feature #20884]]
* Ruby::Box
* 定義の分離を提供する新しい(実験的)機能です。詳細は
[doc/language/box.md](doc/language/box.md) を参照してください。[[Feature
#21311]] [[Misc #21385]]
* Set
* `Set` は自動ロードされる 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 を Version 17.0.0、Emoji を Version 17.0 に更新しました(Regexp
にも適用)。[[Feature #19908]][[Feature #20724]][[Feature #21275]]
* `String#strip`、`strip!`、`lstrip`、`lstrip!`、`rstrip`、`rstrip!` が
`*selectors` 引数を受け付けるようになりました。[[Feature #21552]]
* Thread
* `Kernel#raise` と同様に `Thread#raise(cause:)` 引数をサポートしました。[[Feature #21360]]
## Stdlib の更新
ここでは注目すべき機能変更のみを記載します。
その他の変更は以下のセクションに記載しています。また、前回バンドル版(Ruby 3.4.0)からの GitHub リリース履歴がある場合はそれも記載しています。
次の bundled gem が default gem から昇格しました。
* ostruct 0.6.3
* 0.6.1 to [v0.6.2][ostruct-v0.6.2], [v0.6.3][ostruct-v0.6.3]
* pstore 0.2.0
* 0.1.4 to [v0.2.0][pstore-v0.2.0]
* benchmark 0.5.0
* 0.4.0 to [v0.4.1][benchmark-v0.4.1], [v0.5.0][benchmark-v0.5.0]
* logger 1.7.0
* 1.6.4 to [v1.6.5][logger-v1.6.5], [v1.6.6][logger-v1.6.6],
[v1.7.0][logger-v1.7.0]
* rdoc 7.0.2
* 6.14.0 to [v6.14.1][rdoc-v6.14.1], [v6.14.2][rdoc-v6.14.2],
[v6.15.0][rdoc-v6.15.0], [v6.15.1][rdoc-v6.15.1],
[v6.16.0][rdoc-v6.16.0], [v6.16.1][rdoc-v6.16.1],
[v6.17.0][rdoc-v6.17.0], [v7.0.0][rdoc-v7.0.0], [v7.0.1][rdoc-v7.0.1],
[v7.0.2][rdoc-v7.0.2], [v7.0.3][rdoc-v7.0.3]
* win32ole 1.9.2
* 1.9.1 to [v1.9.2][win32ole-v1.9.2]
* irb 1.16.0
* 1.14.3 to [v1.15.0][irb-v1.15.0], [v1.15.1][irb-v1.15.1],
[v1.15.2][irb-v1.15.2], [v1.15.3][irb-v1.15.3], [v1.16.0][irb-v1.16.0]
* reline 0.6.3
* 0.6.0 to [v0.6.1][reline-v0.6.1], [v0.6.2][reline-v0.6.2],
[v0.6.3][reline-v0.6.3]
* readline 0.0.4
* fiddle 1.1.8
* 1.1.6 to [v1.1.7][fiddle-v1.1.7], [v1.1.8][fiddle-v1.1.8]
次のデフォルト gem を追加しました。
* win32-registry 0.1.2
次の default gem を更新しました。
* RubyGems 4.0.3
* bundler 4.0.3
* date 3.5.1
* 3.4.1 to [v3.5.0][date-v3.5.0], [v3.5.1][date-v3.5.1]
* delegate 0.6.1
* 0.4.0 to [v0.5.0][delegate-v0.5.0], [v0.6.0][delegate-v0.6.0],
[v0.6.1][delegate-v0.6.1]
* digest 3.2.1
* 3.2.0 to [v3.2.1][digest-v3.2.1]
* english 0.8.1
* 0.8.0 to [v0.8.1][english-v0.8.1]
* erb 6.0.1
* 4.0.4 to [v5.1.2][erb-v5.1.2], [v5.1.3][erb-v5.1.3],
[v6.0.0][erb-v6.0.0], [v6.0.1][erb-v6.0.1]
* error_highlight 0.7.1
* etc 1.4.6
* fcntl 1.3.0
* 1.2.0 to [v1.3.0][fcntl-v1.3.0]
* fileutils 1.8.0
* 1.7.3 to [v1.8.0][fileutils-v1.8.0]
* forwardable 1.4.0
* 1.3.3 to [v1.4.0][forwardable-v1.4.0]
* io-console 0.8.2
* 0.8.1 to [v0.8.2][io-console-v0.8.2]
* io-nonblock 0.3.2
* io-wait 0.4.0
* 0.3.2 to [v0.3.3][io-wait-v0.3.3],
[v0.3.5.test1][io-wait-v0.3.5.test1], [v0.3.5][io-wait-v0.3.5],
[v0.3.6][io-wait-v0.3.6], [v0.4.0][io-wait-v0.4.0]
* ipaddr 1.2.8
* json 2.18.0
* 2.9.1 to [v2.10.0][json-v2.10.0], [v2.10.1][json-v2.10.1],
[v2.10.2][json-v2.10.2], [v2.11.0][json-v2.11.0],
[v2.11.1][json-v2.11.1], [v2.11.2][json-v2.11.2],
[v2.11.3][json-v2.11.3], [v2.12.0][json-v2.12.0],
[v2.12.1][json-v2.12.1], [v2.12.2][json-v2.12.2],
[v2.13.0][json-v2.13.0], [v2.13.1][json-v2.13.1],
[v2.13.2][json-v2.13.2], [v2.14.0][json-v2.14.0],
[v2.14.1][json-v2.14.1], [v2.15.0][json-v2.15.0],
[v2.15.1][json-v2.15.1], [v2.15.2][json-v2.15.2],
[v2.16.0][json-v2.16.0], [v2.17.0][json-v2.17.0],
[v2.17.1][json-v2.17.1], [v2.18.0][json-v2.18.0]
* net-http 0.9.1
* 0.6.0 to [v0.7.0][net-http-v0.7.0], [v0.8.0][net-http-v0.8.0],
[v0.9.0][net-http-v0.9.0], [v0.9.1][net-http-v0.9.1]
* openssl 4.0.0
* 3.3.1 to [v3.3.2][openssl-v3.3.2], [v4.0.0][openssl-v4.0.0]
* optparse 0.8.1
* 0.6.0 to [v0.7.0][optparse-v0.7.0], [v0.8.0][optparse-v0.8.0],
[v0.8.1][optparse-v0.8.1]
* pp 0.6.3
* 0.6.2 to [v0.6.3][pp-v0.6.3]
* prism 1.7.0
* 1.5.2 to [v1.6.0][prism-v1.6.0], [v1.7.0][prism-v1.7.0]
* psych 5.3.1
* 5.2.2 to [v5.2.3][psych-v5.2.3], [v5.2.4][psych-v5.2.4],
[v5.2.5][psych-v5.2.5], [v5.2.6][psych-v5.2.6],
[v5.3.0][psych-v5.3.0], [v5.3.1][psych-v5.3.1]
* resolv 0.7.0
* 0.6.2 to [v0.6.3][resolv-v0.6.3], [v0.7.0][resolv-v0.7.0]
* stringio 3.2.0
* 3.1.2 to [v3.1.3][stringio-v3.1.3], [v3.1.4][stringio-v3.1.4],
[v3.1.5][stringio-v3.1.5], [v3.1.6][stringio-v3.1.6],
[v3.1.7][stringio-v3.1.7], [v3.1.8][stringio-v3.1.8],
[v3.1.9][stringio-v3.1.9], [v3.2.0][stringio-v3.2.0]
* strscan 3.1.6
* 3.1.2 to [v3.1.3][strscan-v3.1.3], [v3.1.4][strscan-v3.1.4],
[v3.1.5][strscan-v3.1.5], [v3.1.6][strscan-v3.1.6]
* time 0.4.2
* 0.4.1 to [v0.4.2][time-v0.4.2]
* timeout 0.6.0
* 0.4.3 to [v0.4.4][timeout-v0.4.4], [v0.5.0][timeout-v0.5.0],
[v0.6.0][timeout-v0.6.0]
* uri 1.1.1
* 1.0.4 to [v1.1.0][uri-v1.1.0], [v1.1.1][uri-v1.1.1]
* weakref 0.1.4
* 0.1.3 to [v0.1.4][weakref-v0.1.4]
* zlib 3.2.2
* 3.2.1 to [v3.2.2][zlib-v3.2.2]
次の bundled gem を更新しました。
* minitest 6.0.0
* power_assert 3.0.1
* 2.0.5 to [v3.0.0][power_assert-v3.0.0], [v3.0.1][power_assert-v3.0.1]
* rake 13.3.1
* 13.2.1 to [v13.3.0][rake-v13.3.0], [v13.3.1][rake-v13.3.1]
* test-unit 3.7.3
* 3.6.7 to [3.6.8][test-unit-3.6.8], [3.6.9][test-unit-3.6.9],
[3.7.0][test-unit-3.7.0], [3.7.1][test-unit-3.7.1],
[3.7.2][test-unit-3.7.2], [3.7.3][test-unit-3.7.3],
[3.7.4][test-unit-3.7.4], [3.7.5][test-unit-3.7.5]
* rexml 3.4.4
* rss 0.3.2
* 0.3.1 to [0.3.2][rss-0.3.2]
* net-ftp 0.3.9
* 0.3.8 to [v0.3.9][net-ftp-v0.3.9]
* net-imap 0.6.2
* 0.5.8 to [v0.5.9][net-imap-v0.5.9], [v0.5.10][net-imap-v0.5.10],
[v0.5.11][net-imap-v0.5.11], [v0.5.12][net-imap-v0.5.12],
[v0.5.13][net-imap-v0.5.13], [v0.6.0][net-imap-v0.6.0],
[v0.6.1][net-imap-v0.6.1], [v0.6.2][net-imap-v0.6.2]
* net-smtp 0.5.1
* 0.5.0 to [v0.5.1][net-smtp-v0.5.1]
* matrix 0.4.3
* 0.4.2 to [v0.4.3][matrix-v0.4.3]
* prime 0.1.4
* 0.1.3 to [v0.1.4][prime-v0.1.4]
* rbs 3.10.0
* 3.8.0 to [v3.8.1][rbs-v3.8.1], [v3.9.0.dev.1][rbs-v3.9.0.dev.1],
[v3.9.0.pre.1][rbs-v3.9.0.pre.1], [v3.9.0.pre.2][rbs-v3.9.0.pre.2],
[v3.9.0][rbs-v3.9.0], [v3.9.1][rbs-v3.9.1], [v3.9.2][rbs-v3.9.2],
[v3.9.3][rbs-v3.9.3], [v3.9.4][rbs-v3.9.4], [v3.9.5][rbs-v3.9.5],
[v3.10.0.pre.1][rbs-v3.10.0.pre.1],
[v3.10.0.pre.2][rbs-v3.10.0.pre.2], [v3.10.0][rbs-v3.10.0]
* typeprof 0.31.1
* debug 1.11.1
* 1.11.0 to [v1.11.1][debug-v1.11.1]
* base64 0.3.0
* 0.2.0 to [v0.3.0][base64-v0.3.0]
* bigdecimal 4.0.1
* 3.1.8 to [v3.2.0][bigdecimal-v3.2.0], [v3.2.1][bigdecimal-v3.2.1],
[v3.2.2][bigdecimal-v3.2.2], [v3.2.3][bigdecimal-v3.2.3],
[v3.3.0][bigdecimal-v3.3.0], [v3.3.1][bigdecimal-v3.3.1],
[v4.0.0][bigdecimal-v4.0.0], [v4.0.1][bigdecimal-v4.0.1]
* drb 2.2.3
* 2.2.1 to [v2.2.3][drb-v2.2.3]
* syslog 0.3.0
* 0.2.0 to [v0.3.0][syslog-v0.3.0]
* csv 3.3.5
* 3.3.2 to [v3.3.3][csv-v3.3.3], [v3.3.4][csv-v3.3.4], [v3.3.5][csv-v3.3.5]
* repl_type_completor 0.1.12
### RubyGems と Bundler
RubyGems と Bundler は Version 4 が同梱されています。詳細は次のリンクを参照してください。
* [Upgrading to RubyGems/Bundler 4 - RubyGems
Blog](https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.ht…
* [4.0.0 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/03/4.0.0-released.html)
* [4.0.1 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/09/4.0.1-released.html)
* [4.0.2 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/17/4.0.2-released.html)
* [4.0.3 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/23/4.0.3-released.html)
## サポートプラットフォーム
* Windows
* _MSC_VER 1900 より古い MSVC をサポート対象外としました。つまり Visual Studio 2015 以降が必須になります。
## 互換性に関する注意
* `Ractor::Port` 追加に伴い、Ractor から次のメソッドを削除しました。
* `Ractor.yield`
* `Ractor#take`
* `Ractor#close_incoming`
* `Ractor#close_outgoing`
[[Feature #21262]]
* `ObjectSpace._id2ref` は非推奨になりました。[[Feature #15408]]
* `Process::Status#&` と `Process::Status#>>` を削除しました(Ruby 3.3
で非推奨)。[[Bug #19868]]
* `$SAFE` のパスチェック(Ruby 2.7 で削除)に使われ、既に非推奨だった `rb_path_check`
を削除しました。[[Feature #20971]]
* "wrong number of arguments" の `ArgumentError`
のバックトレースに、受け手のクラス/モジュール名が含まれるようになりました(例: `bar` ではなく `Foo#bar`)。[[Bug
#21698]]
* バックトレースに `internal` フレームが表示されなくなりました。C 実装メソッドも、他の 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>'
```
## Stdlib 互換性の注意
* CGI ライブラリは default gem から除外されました。現在は次のメソッド向けに `cgi/escape` のみ提供します。
* `CGI.escape` / `CGI.unescape`
* `CGI.escapeHTML` / `CGI.unescapeHTML`
* `CGI.escapeURIComponent` / `CGI.unescapeURIComponent`
* `CGI.escapeElement` / `CGI.unescapeElement`
[[Feature #21258]]
* `Set` が stdlib からコアクラスへ移動したため、`set/sorted_set.rb` を削除し、`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_foreach`
* `rb_set_new`
* `rb_set_new_capa`
* `rb_set_lookup`
* `rb_set_add`
* `rb_set_clear`
* `rb_set_delete`
* `rb_set_size`
## 実装の改善
* `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` が高速化されました。
* より大きな多倍長整数でも可変幅アロケーションにより埋め込みのまま保持できるようになりました。
* `Random`、`Enumerator::Product`、`Enumerator::Chain`、`Addrinfo`、`StringScanner`、および一部内部オブジェクトが書き込みバリア保護され、GC
のオーバーヘッドを削減します。
### Ractor
Ractor をより安定・高性能・実用的にするため多くの改善を行いました。これらにより Ractor 実装は実験的ステータスを脱する段階に近づいています。
* パフォーマンス改善
* 凍結文字列とシンボルテーブルが内部でロックフリーのハッシュセットを使用します。[[Feature #21268]]
* メソッドキャッシュの参照で多くの場合ロックを回避します。
* クラス(および generic ivar)のインスタンス変数アクセスが高速化され、ロックを避けます。
* Ractor ごとのカウンタを用いてオブジェクト割り当てでの CPU キャッシュ競合を回避します。
* スレッドローカルカウンタを用いて xmalloc/xfree での CPU キャッシュ競合を回避します。
* 多くの場合 `object_id` 取得でロックを回避します。
* バグ修正と安定性
* Ractor と Thread の併用で起こり得るデッドロックを修正しました。
* Ractor 内での require / autoload の問題を修正しました。
* Ractor 間のエンコーディング/トランスコード問題を修正しました。
* GC 操作やメソッド無効化に関する競合を修正しました。
* Ractor 起動後にプロセスを fork する際の問題を修正しました。
* Ractor 環境下で GC の割り当てカウントが正確になりました。
* GC 後に TracePoint が動作しない問題を修正しました。[[Bug #19112]]
## JIT
* ZJIT
* [メソッドベースの実験的 JIT
コンパイラ](https://docs.ruby-lang.org/en/master/jit/zjit_md.html)
を導入しました。利用可能な場合、ZJIT は `--zjit` オプションまたは `RubyVM::ZJIT.enable`
を呼び出すことで実行時に有効化できます。
Ruby をビルドする場合、ZJIT サポートを含めるには Rust 1.85.0 以降が必要です。
* Ruby 4.0.0 時点で ZJIT はインタプリタより高速ですが、まだ YJIT には及びません。ZJIT
の試用を推奨しますが、現時点では本番利用を推奨しません。
* 目標は Ruby 4.1 で ZJIT を YJIT より高速かつ本番対応にすることです。
* YJIT
* `RubyVM::YJIT.runtime_stats`
* デフォルトビルドでは `ratio_in_yjit` は利用できなくなりました。`configure` で
`--enable-yjit=stats` を付け、`--yjit-stats` で有効化してください。
* すべてのコードが TracePoint により無効化された回数を表す `invalidate_everything`
をデフォルト統計に追加しました。
* `RubyVM::YJIT.enable` に `mem_size:` と `call_threshold:` オプションを追加しました。
* RJIT
* `--rjit` を削除しました。サードパーティ JIT API の実装は
[ruby/rjit](https://github.com/ruby/rjit) リポジトリに移します。
より詳細な情報は [NEWS](https://github.com/ruby/ruby/blob/v4.0.0/NEWS.md)
か [commit logs](https://github.com/ruby/ruby/compare/v3_4_0...v4.0.0) を参照してください。
これらの変更により、Ruby 3.4.0から [3889 ファイルが変更され、 230769 行が追加され、 297003
行が削除されました!deletions(-)](https://github.com/ruby/ruby/compare/v3_4_0...v4.0.…
メリークリスマス、良いお年を、そして Happy Hacking with Ruby 4.0!
!
## Download
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz>
SIZE: 23955109
SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3
SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271
SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz>
SIZE: 18008368
SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602
SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1
SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip>
SIZE: 29253204
SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8
SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455
SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
## What is Ruby
Rubyはまつもとゆきひろ (Matz)
によって1993年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。Rubyは様々なプラットフォームで動き、世界中で、特にWebアプリケーション開発のために使われています。
[Feature #15408]: https://bugs.ruby-lang.org/issues/15408
[Feature #17473]: https://bugs.ruby-lang.org/issues/17473
[Feature #18455]: https://bugs.ruby-lang.org/issues/18455
[Bug #19112]: https://bugs.ruby-lang.org/issues/19112
[Feature #19630]: https://bugs.ruby-lang.org/issues/19630
[Bug #19868]: https://bugs.ruby-lang.org/issues/19868
[Feature #19908]: https://bugs.ruby-lang.org/issues/19908
[Feature #20610]: https://bugs.ruby-lang.org/issues/20610
[Feature #20724]: https://bugs.ruby-lang.org/issues/20724
[Feature #20750]: https://bugs.ruby-lang.org/issues/20750
[Feature #20884]: https://bugs.ruby-lang.org/issues/20884
[Feature #20925]: https://bugs.ruby-lang.org/issues/20925
[Bug #20968]: https://bugs.ruby-lang.org/issues/20968
[Feature #20971]: https://bugs.ruby-lang.org/issues/20971
[Bug #20974]: https://bugs.ruby-lang.org/issues/20974
[Feature #21047]: https://bugs.ruby-lang.org/issues/21047
[Bug #21049]: https://bugs.ruby-lang.org/issues/21049
[Feature #21166]: https://bugs.ruby-lang.org/issues/21166
[Bug #21174]: https://bugs.ruby-lang.org/issues/21174
[Bug #21175]: https://bugs.ruby-lang.org/issues/21175
[Bug #21185]: https://bugs.ruby-lang.org/issues/21185
[Feature #21205]: https://bugs.ruby-lang.org/issues/21205
[Feature #21216]: https://bugs.ruby-lang.org/issues/21216
[Feature #21219]: https://bugs.ruby-lang.org/issues/21219
[Feature #21254]: https://bugs.ruby-lang.org/issues/21254
[Feature #21258]: https://bugs.ruby-lang.org/issues/21258
[Feature #21268]: https://bugs.ruby-lang.org/issues/21268
[Feature #21262]: https://bugs.ruby-lang.org/issues/21262
[Feature #21275]: https://bugs.ruby-lang.org/issues/21275
[Feature #21287]: https://bugs.ruby-lang.org/issues/21287
[Feature #21311]: https://bugs.ruby-lang.org/issues/21311
[Feature #21347]: https://bugs.ruby-lang.org/issues/21347
[Feature #21360]: https://bugs.ruby-lang.org/issues/21360
[Misc #21385]: https://bugs.ruby-lang.org/issues/21385
[Feature #21389]: https://bugs.ruby-lang.org/issues/21389
[Feature #21390]: https://bugs.ruby-lang.org/issues/21390
[Feature #21459]: https://bugs.ruby-lang.org/issues/21459
[Feature #21527]: https://bugs.ruby-lang.org/issues/21527
[Feature #21543]: https://bugs.ruby-lang.org/issues/21543
[Feature #21550]: https://bugs.ruby-lang.org/issues/21550
[Feature #21552]: https://bugs.ruby-lang.org/issues/21552
[Feature #21557]: https://bugs.ruby-lang.org/issues/21557
[Bug #21633]: https://bugs.ruby-lang.org/issues/21633
[Bug #21654]: https://bugs.ruby-lang.org/issues/21654
[Feature #21678]: https://bugs.ruby-lang.org/issues/21678
[Bug #21698]: https://bugs.ruby-lang.org/issues/21698
[Feature #21701]: https://bugs.ruby-lang.org/issues/21701
[Bug #21789]: https://bugs.ruby-lang.org/issues/21789
[GH-net-http #205]: https://github.com/ruby/net-http/issues/205
[ostruct-v0.6.2]: https://github.com/ruby/ostruct/releases/tag/v0.6.2
[ostruct-v0.6.3]: https://github.com/ruby/ostruct/releases/tag/v0.6.3
[pstore-v0.2.0]: https://github.com/ruby/pstore/releases/tag/v0.2.0
[benchmark-v0.4.1]: https://github.com/ruby/benchmark/releases/tag/v0.4.1
[benchmark-v0.5.0]: https://github.com/ruby/benchmark/releases/tag/v0.5.0
[logger-v1.6.5]: https://github.com/ruby/logger/releases/tag/v1.6.5
[logger-v1.6.6]: https://github.com/ruby/logger/releases/tag/v1.6.6
[logger-v1.7.0]: https://github.com/ruby/logger/releases/tag/v1.7.0
[rdoc-v6.14.1]: https://github.com/ruby/rdoc/releases/tag/v6.14.1
[rdoc-v6.14.2]: https://github.com/ruby/rdoc/releases/tag/v6.14.2
[rdoc-v6.15.0]: https://github.com/ruby/rdoc/releases/tag/v6.15.0
[rdoc-v6.15.1]: https://github.com/ruby/rdoc/releases/tag/v6.15.1
[rdoc-v6.16.0]: https://github.com/ruby/rdoc/releases/tag/v6.16.0
[rdoc-v6.16.1]: https://github.com/ruby/rdoc/releases/tag/v6.16.1
[rdoc-v6.17.0]: https://github.com/ruby/rdoc/releases/tag/v6.17.0
[rdoc-v7.0.0]: https://github.com/ruby/rdoc/releases/tag/v7.0.0
[rdoc-v7.0.1]: https://github.com/ruby/rdoc/releases/tag/v7.0.1
[rdoc-v7.0.2]: https://github.com/ruby/rdoc/releases/tag/v7.0.2
[rdoc-v7.0.3]: https://github.com/ruby/rdoc/releases/tag/v7.0.3
[win32ole-v1.9.2]: https://github.com/ruby/win32ole/releases/tag/v1.9.2
[irb-v1.15.0]: https://github.com/ruby/irb/releases/tag/v1.15.0
[irb-v1.15.1]: https://github.com/ruby/irb/releases/tag/v1.15.1
[irb-v1.15.2]: https://github.com/ruby/irb/releases/tag/v1.15.2
[irb-v1.15.3]: https://github.com/ruby/irb/releases/tag/v1.15.3
[irb-v1.16.0]: https://github.com/ruby/irb/releases/tag/v1.16.0
[reline-v0.6.1]: https://github.com/ruby/reline/releases/tag/v0.6.1
[reline-v0.6.2]: https://github.com/ruby/reline/releases/tag/v0.6.2
[reline-v0.6.3]: https://github.com/ruby/reline/releases/tag/v0.6.3
[fiddle-v1.1.7]: https://github.com/ruby/fiddle/releases/tag/v1.1.7
[fiddle-v1.1.8]: https://github.com/ruby/fiddle/releases/tag/v1.1.8
[date-v3.5.0]: https://github.com/ruby/date/releases/tag/v3.5.0
[date-v3.5.1]: https://github.com/ruby/date/releases/tag/v3.5.1
[delegate-v0.5.0]: https://github.com/ruby/delegate/releases/tag/v0.5.0
[delegate-v0.6.0]: https://github.com/ruby/delegate/releases/tag/v0.6.0
[delegate-v0.6.1]: https://github.com/ruby/delegate/releases/tag/v0.6.1
[digest-v3.2.1]: https://github.com/ruby/digest/releases/tag/v3.2.1
[english-v0.8.1]: https://github.com/ruby/english/releases/tag/v0.8.1
[erb-v5.1.2]: https://github.com/ruby/erb/releases/tag/v5.1.2
[erb-v5.1.3]: https://github.com/ruby/erb/releases/tag/v5.1.3
[erb-v6.0.0]: https://github.com/ruby/erb/releases/tag/v6.0.0
[erb-v6.0.1]: https://github.com/ruby/erb/releases/tag/v6.0.1
[fcntl-v1.3.0]: https://github.com/ruby/fcntl/releases/tag/v1.3.0
[fileutils-v1.8.0]: https://github.com/ruby/fileutils/releases/tag/v1.8.0
[forwardable-v1.4.0]: https://github.com/ruby/forwardable/releases/tag/v1.4.0
[io-console-v0.8.2]: https://github.com/ruby/io-console/releases/tag/v0.8.2
[io-wait-v0.3.3]: https://github.com/ruby/io-wait/releases/tag/v0.3.3
[io-wait-v0.3.5.test1]:
https://github.com/ruby/io-wait/releases/tag/v0.3.5.test1
[io-wait-v0.3.5]: https://github.com/ruby/io-wait/releases/tag/v0.3.5
[io-wait-v0.3.6]: https://github.com/ruby/io-wait/releases/tag/v0.3.6
[io-wait-v0.4.0]: https://github.com/ruby/io-wait/releases/tag/v0.4.0
[json-v2.10.0]: https://github.com/ruby/json/releases/tag/v2.10.0
[json-v2.10.1]: https://github.com/ruby/json/releases/tag/v2.10.1
[json-v2.10.2]: https://github.com/ruby/json/releases/tag/v2.10.2
[json-v2.11.0]: https://github.com/ruby/json/releases/tag/v2.11.0
[json-v2.11.1]: https://github.com/ruby/json/releases/tag/v2.11.1
[json-v2.11.2]: https://github.com/ruby/json/releases/tag/v2.11.2
[json-v2.11.3]: https://github.com/ruby/json/releases/tag/v2.11.3
[json-v2.12.0]: https://github.com/ruby/json/releases/tag/v2.12.0
[json-v2.12.1]: https://github.com/ruby/json/releases/tag/v2.12.1
[json-v2.12.2]: https://github.com/ruby/json/releases/tag/v2.12.2
[json-v2.13.0]: https://github.com/ruby/json/releases/tag/v2.13.0
[json-v2.13.1]: https://github.com/ruby/json/releases/tag/v2.13.1
[json-v2.13.2]: https://github.com/ruby/json/releases/tag/v2.13.2
[json-v2.14.0]: https://github.com/ruby/json/releases/tag/v2.14.0
[json-v2.14.1]: https://github.com/ruby/json/releases/tag/v2.14.1
[json-v2.15.0]: https://github.com/ruby/json/releases/tag/v2.15.0
[json-v2.15.1]: https://github.com/ruby/json/releases/tag/v2.15.1
[json-v2.15.2]: https://github.com/ruby/json/releases/tag/v2.15.2
[json-v2.16.0]: https://github.com/ruby/json/releases/tag/v2.16.0
[json-v2.17.0]: https://github.com/ruby/json/releases/tag/v2.17.0
[json-v2.17.1]: https://github.com/ruby/json/releases/tag/v2.17.1
[json-v2.18.0]: https://github.com/ruby/json/releases/tag/v2.18.0
[net-http-v0.7.0]: https://github.com/ruby/net-http/releases/tag/v0.7.0
[net-http-v0.8.0]: https://github.com/ruby/net-http/releases/tag/v0.8.0
[net-http-v0.9.0]: https://github.com/ruby/net-http/releases/tag/v0.9.0
[net-http-v0.9.1]: https://github.com/ruby/net-http/releases/tag/v0.9.1
[openssl-v3.3.2]: https://github.com/ruby/openssl/releases/tag/v3.3.2
[openssl-v4.0.0]: https://github.com/ruby/openssl/releases/tag/v4.0.0
[optparse-v0.7.0]: https://github.com/ruby/optparse/releases/tag/v0.7.0
[optparse-v0.8.0]: https://github.com/ruby/optparse/releases/tag/v0.8.0
[optparse-v0.8.1]: https://github.com/ruby/optparse/releases/tag/v0.8.1
[pp-v0.6.3]: https://github.com/ruby/pp/releases/tag/v0.6.3
[prism-v1.6.0]: https://github.com/ruby/prism/releases/tag/v1.6.0
[prism-v1.7.0]: https://github.com/ruby/prism/releases/tag/v1.7.0
[psych-v5.2.3]: https://github.com/ruby/psych/releases/tag/v5.2.3
[psych-v5.2.4]: https://github.com/ruby/psych/releases/tag/v5.2.4
[psych-v5.2.5]: https://github.com/ruby/psych/releases/tag/v5.2.5
[psych-v5.2.6]: https://github.com/ruby/psych/releases/tag/v5.2.6
[psych-v5.3.0]: https://github.com/ruby/psych/releases/tag/v5.3.0
[psych-v5.3.1]: https://github.com/ruby/psych/releases/tag/v5.3.1
[resolv-v0.6.3]: https://github.com/ruby/resolv/releases/tag/v0.6.3
[resolv-v0.7.0]: https://github.com/ruby/resolv/releases/tag/v0.7.0
[stringio-v3.1.3]: https://github.com/ruby/stringio/releases/tag/v3.1.3
[stringio-v3.1.4]: https://github.com/ruby/stringio/releases/tag/v3.1.4
[stringio-v3.1.5]: https://github.com/ruby/stringio/releases/tag/v3.1.5
[stringio-v3.1.6]: https://github.com/ruby/stringio/releases/tag/v3.1.6
[stringio-v3.1.7]: https://github.com/ruby/stringio/releases/tag/v3.1.7
[stringio-v3.1.8]: https://github.com/ruby/stringio/releases/tag/v3.1.8
[stringio-v3.1.9]: https://github.com/ruby/stringio/releases/tag/v3.1.9
[stringio-v3.2.0]: https://github.com/ruby/stringio/releases/tag/v3.2.0
[strscan-v3.1.3]: https://github.com/ruby/strscan/releases/tag/v3.1.3
[strscan-v3.1.4]: https://github.com/ruby/strscan/releases/tag/v3.1.4
[strscan-v3.1.5]: https://github.com/ruby/strscan/releases/tag/v3.1.5
[strscan-v3.1.6]: https://github.com/ruby/strscan/releases/tag/v3.1.6
[time-v0.4.2]: https://github.com/ruby/time/releases/tag/v0.4.2
[timeout-v0.4.4]: https://github.com/ruby/timeout/releases/tag/v0.4.4
[timeout-v0.5.0]: https://github.com/ruby/timeout/releases/tag/v0.5.0
[timeout-v0.6.0]: https://github.com/ruby/timeout/releases/tag/v0.6.0
[uri-v1.1.0]: https://github.com/ruby/uri/releases/tag/v1.1.0
[uri-v1.1.1]: https://github.com/ruby/uri/releases/tag/v1.1.1
[weakref-v0.1.4]: https://github.com/ruby/weakref/releases/tag/v0.1.4
[zlib-v3.2.2]: https://github.com/ruby/zlib/releases/tag/v3.2.2
[power_assert-v3.0.0]: https://github.com/ruby/power_assert/releases/tag/v3.0.0
[power_assert-v3.0.1]: https://github.com/ruby/power_assert/releases/tag/v3.0.1
[rake-v13.3.0]: https://github.com/ruby/rake/releases/tag/v13.3.0
[rake-v13.3.1]: https://github.com/ruby/rake/releases/tag/v13.3.1
[test-unit-3.6.8]: https://github.com/test-unit/test-unit/releases/tag/3.6.8
[test-unit-3.6.9]: https://github.com/test-unit/test-unit/releases/tag/3.6.9
[test-unit-3.7.0]: https://github.com/test-unit/test-unit/releases/tag/3.7.0
[test-unit-3.7.1]: https://github.com/test-unit/test-unit/releases/tag/3.7.1
[test-unit-3.7.2]: https://github.com/test-unit/test-unit/releases/tag/3.7.2
[test-unit-3.7.3]: https://github.com/test-unit/test-unit/releases/tag/3.7.3
[test-unit-3.7.4]: https://github.com/test-unit/test-unit/releases/tag/3.7.4
[test-unit-3.7.5]: https://github.com/test-unit/test-unit/releases/tag/3.7.5
[rss-0.3.2]: https://github.com/ruby/rss/releases/tag/0.3.2
[net-ftp-v0.3.9]: https://github.com/ruby/net-ftp/releases/tag/v0.3.9
[net-imap-v0.5.9]: https://github.com/ruby/net-imap/releases/tag/v0.5.9
[net-imap-v0.5.10]: https://github.com/ruby/net-imap/releases/tag/v0.5.10
[net-imap-v0.5.11]: https://github.com/ruby/net-imap/releases/tag/v0.5.11
[net-imap-v0.5.12]: https://github.com/ruby/net-imap/releases/tag/v0.5.12
[net-imap-v0.5.13]: https://github.com/ruby/net-imap/releases/tag/v0.5.13
[net-imap-v0.6.0]: https://github.com/ruby/net-imap/releases/tag/v0.6.0
[net-imap-v0.6.1]: https://github.com/ruby/net-imap/releases/tag/v0.6.1
[net-imap-v0.6.2]: https://github.com/ruby/net-imap/releases/tag/v0.6.2
[net-smtp-v0.5.1]: https://github.com/ruby/net-smtp/releases/tag/v0.5.1
[matrix-v0.4.3]: https://github.com/ruby/matrix/releases/tag/v0.4.3
[prime-v0.1.4]: https://github.com/ruby/prime/releases/tag/v0.1.4
[rbs-v3.8.1]: https://github.com/ruby/rbs/releases/tag/v3.8.1
[rbs-v3.9.0.dev.1]: https://github.com/ruby/rbs/releases/tag/v3.9.0.dev.1
[rbs-v3.9.0.pre.1]: https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.1
[rbs-v3.9.0.pre.2]: https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.2
[rbs-v3.9.0]: https://github.com/ruby/rbs/releases/tag/v3.9.0
[rbs-v3.9.1]: https://github.com/ruby/rbs/releases/tag/v3.9.1
[rbs-v3.9.2]: https://github.com/ruby/rbs/releases/tag/v3.9.2
[rbs-v3.9.3]: https://github.com/ruby/rbs/releases/tag/v3.9.3
[rbs-v3.9.4]: https://github.com/ruby/rbs/releases/tag/v3.9.4
[rbs-v3.9.5]: https://github.com/ruby/rbs/releases/tag/v3.9.5
[rbs-v3.10.0.pre.1]: https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.1
[rbs-v3.10.0.pre.2]: https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.2
[rbs-v3.10.0]: https://github.com/ruby/rbs/releases/tag/v3.10.0
[debug-v1.11.1]: https://github.com/ruby/debug/releases/tag/v1.11.1
[base64-v0.3.0]: https://github.com/ruby/base64/releases/tag/v0.3.0
[bigdecimal-v3.2.0]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.0
[bigdecimal-v3.2.1]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.1
[bigdecimal-v3.2.2]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.2
[bigdecimal-v3.2.3]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.3
[bigdecimal-v3.3.0]: https://github.com/ruby/bigdecimal/releases/tag/v3.3.0
[bigdecimal-v3.3.1]: https://github.com/ruby/bigdecimal/releases/tag/v3.3.1
[bigdecimal-v4.0.0]: https://github.com/ruby/bigdecimal/releases/tag/v4.0.0
[bigdecimal-v4.0.1]: https://github.com/ruby/bigdecimal/releases/tag/v4.0.1
[drb-v2.2.3]: https://github.com/ruby/drb/releases/tag/v2.2.3
[syslog-v0.3.0]: https://github.com/ruby/syslog/releases/tag/v0.3.0
[csv-v3.3.3]: https://github.com/ruby/csv/releases/tag/v3.3.3
[csv-v3.3.4]: https://github.com/ruby/csv/releases/tag/v3.3.4
[csv-v3.3.5]: https://github.com/ruby/csv/releases/tag/v3.3.5
1
0
We are pleased to announce the release of Ruby 4.0.0.
Ruby 4.0 introduces "Ruby Box" and "ZJIT", and adds many improvements.
## Ruby Box
Ruby Box is a new (experimental) feature to provide separation about
definitions. Ruby Box is enabled when an environment variable
`RUBY_BOX=1` is specified. The class is `Ruby::Box`.
Definitions loaded in a box are isolated in the box. Ruby Box can
isolate/separate monkey patches, changes of global/class variables,
class/module definitions, and loaded native/ruby libraries from other
boxes.
Expected use cases are:
* Run test cases in box to protect other tests when the test case uses
monkey patches to override something
* Run web app boxes in parallel to execute blue-green deployment on an
app server in a Ruby process
* Run web app boxes in parallel to evaluate dependency updates for a
certain period of time by checking response diff using Ruby code
* Used as the foundation (low-level) API to implement kind of
"package" (high-level) API (it is not designed yet)
For the detail of "Ruby Box", see [doc/language/box.md](doc/language/box.md).
[[Feature #21311]] [[Misc #21385]]
## ZJIT
ZJIT is a new just-in-time (JIT) compiler, which is developed as the
next generation of YJIT. You need Rust 1.85.0 or newer to build Ruby
with ZJIT support, and ZJIT is enabled when `--zjit` is specified.
We're building a new compiler for Ruby because we want to both raise
the performance ceiling (bigger compilation unit size and SSA IR) and
encourage more outside contribution (by becoming a more traditional
method compiler). See [our blog
post](https://railsatscale.com/2025-12-24-launch-zjit/) for more
details.
<!-- the blog post will be auto-published on 2025-12-24 9:00am UTC. -->
ZJIT is faster than the interpreter, but not yet as fast as YJIT. We
encourage you to experiment with ZJIT, but maybe hold off on deploying
it in production for now. Stay tuned for Ruby 4.1 ZJIT.
## Ractor Improvements
Ractor, Ruby's parallel execution mechanism, has received several
improvements. A new class, `Ractor::Port`, was introduced to address
issues related to message sending and receiving (see [our blog
post](https://dev.to/ko1/ractorport-revamping-the-ractor-api-98)).
Additionally, `Ractor.shareable_proc` makes it easier to share `Proc`
objects between Ractors.
On the performance side, many internal data structures have been
improved to significantly reduce contention on a global lock,
unlocking better parallelism. Ractors also now share less internal
data, resulting in less CPU cache contention when running in parallel.
Ractor was first introduced in Ruby 3.0 as an experimental feature. We
aim to remove its "experimental" status next year.
## Language changes
* `*nil` no longer calls `nil.to_a`, similar to how `**nil` does
not call `nil.to_hash`. [[Feature #21047]]
* Logical binary operators (`||`, `&&`, `and` and `or`) at the
beginning of a line continue the previous line, like fluent dot.
The following code examples are equal:
```ruby
if condition1
&& condition2
...
end
```
Previously:
```ruby
if condition1 && condition2
...
end
```
```ruby
if condition1 &&
condition2
...
end
```
[[Feature #20925]]
## Core classes updates
Note: We're only listing outstanding class updates.
* Array
* `Array#rfind` has been added as a more efficient alternative to
`array.reverse_each.find` [[Feature #21678]]
* `Array#find` has been added as a more efficient override of
`Enumerable#find` [[Feature #21678]]
* Binding
* `Binding#local_variables` does no longer include numbered parameters.
Also, `Binding#local_variable_get`, `Binding#local_variable_set`, and
`Binding#local_variable_defined?` reject to handle numbered parameters.
[[Bug #21049]]
* `Binding#implicit_parameters`, `Binding#implicit_parameter_get`, and
`Binding#implicit_parameter_defined?` have been added to access
numbered parameters and "it" parameter. [[Bug #21049]]
* Enumerator
* `Enumerator.produce` now accepts an optional `size` keyword argument
to specify the size of the enumerator. It can be an integer,
`Float::INFINITY`, a callable object (such as a lambda), or `nil` to
indicate unknown size. When not specified, the size defaults to
`Float::INFINITY`.
```ruby
# Infinite enumerator
enum = Enumerator.produce(1, size: Float::INFINITY, &:succ)
enum.size # => Float::INFINITY
# Finite enumerator with known/computable size
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
```
[[Feature #21701]]
* ErrorHighlight
* When an ArgumentError is raised, it now displays code snippets for
both the method call (caller) and the method definition (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>'
```
* Fiber
* Introduce support for `Fiber#raise(cause:)` argument similar to
`Kernel#raise`. [[Feature #21360]]
* Fiber::Scheduler
* Introduce `Fiber::Scheduler#fiber_interrupt` to interrupt a fiber with a
given exception. The initial use case is to interrupt a fiber that is
waiting on a blocking IO operation when the IO operation is closed.
[[Feature #21166]]
* Introduce `Fiber::Scheduler#yield` to allow the fiber scheduler to
continue processing when signal exceptions are disabled.
[[Bug #21633]]
* Reintroduce the `Fiber::Scheduler#io_close` hook for
asynchronous `IO#close`.
* Invoke `Fiber::Scheduler#io_write` when flushing the IO write buffer.
[[Bug #21789]]
* File
* `File::Stat#birthtime` is now available on Linux via the statx
system call when supported by the kernel and filesystem.
[[Feature #21205]]
* IO
* `IO.select` accepts `Float::INFINITY` as a timeout argument.
[[Feature #20610]]
* A deprecated behavior, process creation by `IO` class methods
with a leading `|`, was removed. [[Feature #19630]]
* Kernel
* `Kernel#inspect` now checks for the existence of a
`#instance_variables_to_inspect` method,
allowing control over which instance variables are displayed in
the `#inspect` string:
```ruby
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">
```
[[Feature #21219]]
* A deprecated behavior, process creation by `Kernel#open` with a
leading `|`, was removed. [[Feature #19630]]
* Math
* `Math.log1p` and `Math.expm1` are added. [[Feature #21527]]
* Pathname
* Pathname has been promoted from a default gem to a core class of Ruby.
[[Feature #17473]]
* Proc
* `Proc#parameters` now shows anonymous optional parameters as `[:opt]`
instead of `[:opt, nil]`, making the output consistent with when the
anonymous parameter is required. [[Bug #20974]]
* Ractor
* `Ractor::Port` class was added for a new synchronization mechanism
to communicate between Ractors. [[Feature #21262]]
```ruby
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::Port` provides the following methods:
* `Ractor::Port#receive`
* `Ractor::Port#send` (or `Ractor::Port#<<`)
* `Ractor::Port#close`
* `Ractor::Port#closed?`
As a result, `Ractor.yield` and `Ractor#take` were removed.
* `Ractor#join` and `Ractor#value` were added to wait for the
termination of a Ractor. These are similar to `Thread#join`
and `Thread#value`.
* `Ractor#monitor` and `Ractor#unmonitor` were added as low-level
interfaces used internally to implement `Ractor#join`.
* `Ractor.select` now only accepts Ractors and Ports. If Ractors are given,
it returns when a Ractor terminates.
* `Ractor#default_port` was added. Each `Ractor` has a default port,
which is used by `Ractor.send`, `Ractor.receive`.
* `Ractor#close_incoming` and `Ractor#close_outgoing` were removed.
* `Ractor.shareable_proc` and `Ractor.shareable_lambda` are introduced
to make shareable Proc or lambda.
[[Feature #21550]], [[Feature #21557]]
* Range
* `Range#to_set` now performs size checks to prevent issues with
endless ranges. [[Bug #21654]]
* `Range#overlap?` now correctly handles infinite (unbounded) ranges.
[[Bug #21185]]
* `Range#max` behavior on beginless integer ranges has been fixed.
[[Bug #21174]] [[Bug #21175]]
* Ruby
* A new toplevel module `Ruby` has been defined, which contains
Ruby-related constants. This module was reserved in Ruby 3.4
and is now officially defined. [[Feature #20884]]
* Ruby::Box
* A new (experimental) feature to provide separation about definitions.
For the detail of "Ruby Box", see
[doc/language/box.md](doc/language/box.md).
[[Feature #21311]] [[Misc #21385]]
* Set
* `Set` is now a core class, instead of an autoloaded stdlib class.
[[Feature #21216]]
* `Set#inspect` now uses a simpler display, similar to literal arrays.
(e.g., `Set[1, 2, 3]` instead of `#<Set: {1, 2, 3}>`). [[Feature #21389]]
* Passing arguments to `Set#to_set` and `Enumerable#to_set` is now
deprecated.
[[Feature #21390]]
* Socket
* `Socket.tcp` & `TCPSocket.new` accepts an `open_timeout` keyword
argument to specify
the timeout for the initial connection. [[Feature #21347]]
* When a user-specified timeout occurred in `TCPSocket.new`,
either `Errno::ETIMEDOUT`
or `IO::TimeoutError` could previously be raised depending on
the situation.
This behavior has been unified so that `IO::TimeoutError` is now
consistently raised.
(Please note that, in `Socket.tcp`, there are still cases where
`Errno::ETIMEDOUT`
may be raised in similar situations, and that in both cases
`Errno::ETIMEDOUT` may be
raised when the timeout occurs at the OS level.)
* String
* Update Unicode to Version 17.0.0 and Emoji Version 17.0.
[[Feature #19908]][[Feature #20724]][[Feature #21275]] (also
applies to Regexp)
* `String#strip`, `strip!`, `lstrip`, `lstrip!`, `rstrip`, and `rstrip!`
are extended to accept `*selectors` arguments. [[Feature #21552]]
* Thread
* Introduce support for `Thread#raise(cause:)` argument similar to
`Kernel#raise`. [[Feature #21360]]
## Stdlib updates
We only list stdlib changes that are notable feature changes.
Other changes are listed in the following sections. We also listed
release history from the previous bundled version that is Ruby 3.4.0
if it has GitHub releases.
The following bundled gems are promoted from default gems.
* ostruct 0.6.3
* 0.6.1 to [v0.6.2][ostruct-v0.6.2], [v0.6.3][ostruct-v0.6.3]
* pstore 0.2.0
* 0.1.4 to [v0.2.0][pstore-v0.2.0]
* benchmark 0.5.0
* 0.4.0 to [v0.4.1][benchmark-v0.4.1], [v0.5.0][benchmark-v0.5.0]
* logger 1.7.0
* 1.6.4 to [v1.6.5][logger-v1.6.5], [v1.6.6][logger-v1.6.6],
[v1.7.0][logger-v1.7.0]
* rdoc 7.0.2
* 6.14.0 to [v6.14.1][rdoc-v6.14.1], [v6.14.2][rdoc-v6.14.2],
[v6.15.0][rdoc-v6.15.0], [v6.15.1][rdoc-v6.15.1],
[v6.16.0][rdoc-v6.16.0], [v6.16.1][rdoc-v6.16.1],
[v6.17.0][rdoc-v6.17.0], [v7.0.0][rdoc-v7.0.0], [v7.0.1][rdoc-v7.0.1],
[v7.0.2][rdoc-v7.0.2], [v7.0.3][rdoc-v7.0.3]
* win32ole 1.9.2
* 1.9.1 to [v1.9.2][win32ole-v1.9.2]
* irb 1.16.0
* 1.14.3 to [v1.15.0][irb-v1.15.0], [v1.15.1][irb-v1.15.1],
[v1.15.2][irb-v1.15.2], [v1.15.3][irb-v1.15.3], [v1.16.0][irb-v1.16.0]
* reline 0.6.3
* 0.6.0 to [v0.6.1][reline-v0.6.1], [v0.6.2][reline-v0.6.2],
[v0.6.3][reline-v0.6.3]
* readline 0.0.4
* fiddle 1.1.8
* 1.1.6 to [v1.1.7][fiddle-v1.1.7], [v1.1.8][fiddle-v1.1.8]
The following default gem is added.
* win32-registry 0.1.2
The following default gems are updated.
* RubyGems 4.0.3
* bundler 4.0.3
* date 3.5.1
* 3.4.1 to [v3.5.0][date-v3.5.0], [v3.5.1][date-v3.5.1]
* delegate 0.6.1
* 0.4.0 to [v0.5.0][delegate-v0.5.0], [v0.6.0][delegate-v0.6.0],
[v0.6.1][delegate-v0.6.1]
* digest 3.2.1
* 3.2.0 to [v3.2.1][digest-v3.2.1]
* english 0.8.1
* 0.8.0 to [v0.8.1][english-v0.8.1]
* erb 6.0.1
* 4.0.4 to [v5.1.2][erb-v5.1.2], [v5.1.3][erb-v5.1.3],
[v6.0.0][erb-v6.0.0], [v6.0.1][erb-v6.0.1]
* error_highlight 0.7.1
* etc 1.4.6
* fcntl 1.3.0
* 1.2.0 to [v1.3.0][fcntl-v1.3.0]
* fileutils 1.8.0
* 1.7.3 to [v1.8.0][fileutils-v1.8.0]
* forwardable 1.4.0
* 1.3.3 to [v1.4.0][forwardable-v1.4.0]
* io-console 0.8.2
* 0.8.1 to [v0.8.2][io-console-v0.8.2]
* io-nonblock 0.3.2
* io-wait 0.4.0
* 0.3.2 to [v0.3.3][io-wait-v0.3.3],
[v0.3.5.test1][io-wait-v0.3.5.test1], [v0.3.5][io-wait-v0.3.5],
[v0.3.6][io-wait-v0.3.6], [v0.4.0][io-wait-v0.4.0]
* ipaddr 1.2.8
* json 2.18.0
* 2.9.1 to [v2.10.0][json-v2.10.0], [v2.10.1][json-v2.10.1],
[v2.10.2][json-v2.10.2], [v2.11.0][json-v2.11.0],
[v2.11.1][json-v2.11.1], [v2.11.2][json-v2.11.2],
[v2.11.3][json-v2.11.3], [v2.12.0][json-v2.12.0],
[v2.12.1][json-v2.12.1], [v2.12.2][json-v2.12.2],
[v2.13.0][json-v2.13.0], [v2.13.1][json-v2.13.1],
[v2.13.2][json-v2.13.2], [v2.14.0][json-v2.14.0],
[v2.14.1][json-v2.14.1], [v2.15.0][json-v2.15.0],
[v2.15.1][json-v2.15.1], [v2.15.2][json-v2.15.2],
[v2.16.0][json-v2.16.0], [v2.17.0][json-v2.17.0],
[v2.17.1][json-v2.17.1], [v2.18.0][json-v2.18.0]
* net-http 0.9.1
* 0.6.0 to [v0.7.0][net-http-v0.7.0], [v0.8.0][net-http-v0.8.0],
[v0.9.0][net-http-v0.9.0], [v0.9.1][net-http-v0.9.1]
* openssl 4.0.0
* 3.3.1 to [v3.3.2][openssl-v3.3.2], [v4.0.0][openssl-v4.0.0]
* optparse 0.8.1
* 0.6.0 to [v0.7.0][optparse-v0.7.0], [v0.8.0][optparse-v0.8.0],
[v0.8.1][optparse-v0.8.1]
* pp 0.6.3
* 0.6.2 to [v0.6.3][pp-v0.6.3]
* prism 1.7.0
* 1.5.2 to [v1.6.0][prism-v1.6.0], [v1.7.0][prism-v1.7.0]
* psych 5.3.1
* 5.2.2 to [v5.2.3][psych-v5.2.3], [v5.2.4][psych-v5.2.4],
[v5.2.5][psych-v5.2.5], [v5.2.6][psych-v5.2.6],
[v5.3.0][psych-v5.3.0], [v5.3.1][psych-v5.3.1]
* resolv 0.7.0
* 0.6.2 to [v0.6.3][resolv-v0.6.3], [v0.7.0][resolv-v0.7.0]
* stringio 3.2.0
* 3.1.2 to [v3.1.3][stringio-v3.1.3], [v3.1.4][stringio-v3.1.4],
[v3.1.5][stringio-v3.1.5], [v3.1.6][stringio-v3.1.6],
[v3.1.7][stringio-v3.1.7], [v3.1.8][stringio-v3.1.8],
[v3.1.9][stringio-v3.1.9], [v3.2.0][stringio-v3.2.0]
* strscan 3.1.6
* 3.1.2 to [v3.1.3][strscan-v3.1.3], [v3.1.4][strscan-v3.1.4],
[v3.1.5][strscan-v3.1.5], [v3.1.6][strscan-v3.1.6]
* time 0.4.2
* 0.4.1 to [v0.4.2][time-v0.4.2]
* timeout 0.6.0
* 0.4.3 to [v0.4.4][timeout-v0.4.4], [v0.5.0][timeout-v0.5.0],
[v0.6.0][timeout-v0.6.0]
* uri 1.1.1
* 1.0.4 to [v1.1.0][uri-v1.1.0], [v1.1.1][uri-v1.1.1]
* weakref 0.1.4
* 0.1.3 to [v0.1.4][weakref-v0.1.4]
* zlib 3.2.2
* 3.2.1 to [v3.2.2][zlib-v3.2.2]
The following bundled gems are updated.
* minitest 6.0.0
* power_assert 3.0.1
* 2.0.5 to [v3.0.0][power_assert-v3.0.0], [v3.0.1][power_assert-v3.0.1]
* rake 13.3.1
* 13.2.1 to [v13.3.0][rake-v13.3.0], [v13.3.1][rake-v13.3.1]
* test-unit 3.7.3
* 3.6.7 to [3.6.8][test-unit-3.6.8], [3.6.9][test-unit-3.6.9],
[3.7.0][test-unit-3.7.0], [3.7.1][test-unit-3.7.1],
[3.7.2][test-unit-3.7.2], [3.7.3][test-unit-3.7.3],
[3.7.4][test-unit-3.7.4], [3.7.5][test-unit-3.7.5]
* rexml 3.4.4
* rss 0.3.2
* 0.3.1 to [0.3.2][rss-0.3.2]
* net-ftp 0.3.9
* 0.3.8 to [v0.3.9][net-ftp-v0.3.9]
* net-imap 0.6.2
* 0.5.8 to [v0.5.9][net-imap-v0.5.9], [v0.5.10][net-imap-v0.5.10],
[v0.5.11][net-imap-v0.5.11], [v0.5.12][net-imap-v0.5.12],
[v0.5.13][net-imap-v0.5.13], [v0.6.0][net-imap-v0.6.0],
[v0.6.1][net-imap-v0.6.1], [v0.6.2][net-imap-v0.6.2]
* net-smtp 0.5.1
* 0.5.0 to [v0.5.1][net-smtp-v0.5.1]
* matrix 0.4.3
* 0.4.2 to [v0.4.3][matrix-v0.4.3]
* prime 0.1.4
* 0.1.3 to [v0.1.4][prime-v0.1.4]
* rbs 3.10.0
* 3.8.0 to [v3.8.1][rbs-v3.8.1], [v3.9.0.dev.1][rbs-v3.9.0.dev.1],
[v3.9.0.pre.1][rbs-v3.9.0.pre.1], [v3.9.0.pre.2][rbs-v3.9.0.pre.2],
[v3.9.0][rbs-v3.9.0], [v3.9.1][rbs-v3.9.1], [v3.9.2][rbs-v3.9.2],
[v3.9.3][rbs-v3.9.3], [v3.9.4][rbs-v3.9.4], [v3.9.5][rbs-v3.9.5],
[v3.10.0.pre.1][rbs-v3.10.0.pre.1],
[v3.10.0.pre.2][rbs-v3.10.0.pre.2], [v3.10.0][rbs-v3.10.0]
* typeprof 0.31.1
* debug 1.11.1
* 1.11.0 to [v1.11.1][debug-v1.11.1]
* base64 0.3.0
* 0.2.0 to [v0.3.0][base64-v0.3.0]
* bigdecimal 4.0.1
* 3.1.8 to [v3.2.0][bigdecimal-v3.2.0], [v3.2.1][bigdecimal-v3.2.1],
[v3.2.2][bigdecimal-v3.2.2], [v3.2.3][bigdecimal-v3.2.3],
[v3.3.0][bigdecimal-v3.3.0], [v3.3.1][bigdecimal-v3.3.1],
[v4.0.0][bigdecimal-v4.0.0], [v4.0.1][bigdecimal-v4.0.1]
* drb 2.2.3
* 2.2.1 to [v2.2.3][drb-v2.2.3]
* syslog 0.3.0
* 0.2.0 to [v0.3.0][syslog-v0.3.0]
* csv 3.3.5
* 3.3.2 to [v3.3.3][csv-v3.3.3], [v3.3.4][csv-v3.3.4], [v3.3.5][csv-v3.3.5]
* repl_type_completor 0.1.12
### RubyGems and Bundler
Ruby 4.0 bundled RubyGems and Bundler version 4. see the following
links for details.
* [Upgrading to RubyGems/Bundler 4 - RubyGems
Blog](https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.ht…
* [4.0.0 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/03/4.0.0-released.html)
* [4.0.1 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/09/4.0.1-released.html)
* [4.0.2 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/17/4.0.2-released.html)
* [4.0.3 Released - RubyGems
Blog](https://blog.rubygems.org/2025/12/23/4.0.3-released.html)
## Supported platforms
* Windows
* Dropped support for MSVC versions older than 14.0 (_MSC_VER 1900).
This means Visual Studio 2015 or later is now required.
## Compatibility issues
* The following methods were removed from Ractor due to the addition
of `Ractor::Port`:
* `Ractor.yield`
* `Ractor#take`
* `Ractor#close_incoming`
* `Ractor#close_outgoing`
[[Feature #21262]]
* `ObjectSpace._id2ref` is deprecated. [[Feature #15408]]
* `Process::Status#&` and `Process::Status#>>` have been removed.
They were deprecated in Ruby 3.3. [[Bug #19868]]
* `rb_path_check` has been removed. This function was used for
`$SAFE` path checking which was removed in Ruby 2.7,
and was already deprecated.
[[Feature #20971]]
* A backtrace for `ArgumentError` of "wrong number of arguments" now
include the receiver's class or module name (e.g., in `Foo#bar`
instead of in `bar`). [[Bug #21698]]
* Backtraces no longer display `internal` frames.
These methods now appear as if it is in the Ruby source file,
consistent with other C-implemented methods. [[Bug #20968]]
Before:
```
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>'
```
After:
```
$ 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>'
```
## Stdlib compatibility issues
* CGI library is removed from the default gems. Now we only provide
`cgi/escape` for
the following methods:
* `CGI.escape` and `CGI.unescape`
* `CGI.escapeHTML` and `CGI.unescapeHTML`
* `CGI.escapeURIComponent` and `CGI.unescapeURIComponent`
* `CGI.escapeElement` and `CGI.unescapeElement`
[[Feature #21258]]
* With the move of `Set` from stdlib to core class, `set/sorted_set.rb` has
been removed, and `SortedSet` is no longer an autoloaded constant. Please
install the `sorted_set` gem and `require 'sorted_set'` to use `SortedSet`.
[[Feature #21287]]
* Net::HTTP
* The default behavior of automatically setting the `Content-Type` header
to `application/x-www-form-urlencoded` for requests with a body
(e.g., `POST`, `PUT`) when the header was not explicitly set has been
removed. If your application relied on this automatic default, your
requests will now be sent without a Content-Type header, potentially
breaking compatibility with certain servers.
[[GH-net-http #205]]
## C API updates
* IO
* `rb_thread_fd_close` is deprecated and now a no-op. If you need to expose
file descriptors from C extensions to Ruby code, create an `IO` instance
using `RUBY_IO_MODE_EXTERNAL` and use `rb_io_close(io)` to close it (this
also interrupts and waits for all pending operations on the `IO`
instance). Directly closing file descriptors does not interrupt pending
operations, and may lead to undefined behaviour. In other words, if two
`IO` objects share the same file descriptor, closing one does not affect
the other. [[Feature #18455]]
* GVL
* `rb_thread_call_with_gvl` now works with or without the GVL.
This allows gems to avoid checking `ruby_thread_has_gvl_p`.
Please still be diligent about the GVL. [[Feature #20750]]
* Set
* A C API for `Set` has been added. The following methods are supported:
[[Feature #21459]]
* `rb_set_foreach`
* `rb_set_new`
* `rb_set_new_capa`
* `rb_set_lookup`
* `rb_set_add`
* `rb_set_clear`
* `rb_set_delete`
* `rb_set_size`
## Implementation improvements
* `Class#new` (ex. `Object.new`) is faster in all cases, but
especially when passing keyword arguments. This has also been
integrated into YJIT and ZJIT. [[Feature #21254]]
* GC heaps of different size pools now grow independently, reducing
memory usage when only some pools contain long-lived objects
* GC sweeping is faster on pages of large objects
* "Generic ivar" objects (String, Array, `TypedData`, etc.) now use a
new internal "fields" object for faster instance variable access
* The GC avoids maintaining an internal `id2ref` table until it is
first used, making `object_id` allocation and GC sweeping faster
* `object_id` and `hash` are faster on Class and Module objects
* Larger bignum Integers can remain embedded using variable width allocation
* `Random`, `Enumerator::Product`, `Enumerator::Chain`, `Addrinfo`,
`StringScanner`, and some internal objects are now write-barrier protected,
which reduces GC overhead.
### Ractor
A lot of work has gone into making Ractors more stable, performant,
and usable. These improvements bring Ractor implementation closer to
leaving experimental status.
* Performance improvements
* Frozen strings and the symbol table internally use a lock-free
hash set [[Feature #21268]]
* Method cache lookups avoid locking in most cases
* Class (and generic ivar) instance variable access is faster and
avoids locking
* CPU cache contention is avoided in object allocation by using a
per-ractor counter
* CPU cache contention is avoided in xmalloc/xfree by using a
thread-local counter
* `object_id` avoids locking in most cases
* Bug fixes and stability
* Fixed possible deadlocks when combining Ractors and Threads
* Fixed issues with require and autoload in a Ractor
* Fixed encoding/transcoding issues across Ractors
* Fixed race conditions in GC operations and method invalidation
* Fixed issues with processes forking after starting a Ractor
* GC allocation counts are now accurate under Ractors
* Fixed TracePoints not working after GC [[Bug #19112]]
## JIT
* ZJIT
* Introduce an [experimental method-based JIT
compiler](https://docs.ruby-lang.org/en/master/jit/zjit_md.html).
Where available, ZJIT can be enabled at runtime with the
`--zjit` option or by calling `RubyVM::ZJIT.enable`.
When building Ruby, Rust 1.85.0 or later is required to include
ZJIT support.
* As of Ruby 4.0.0, ZJIT is faster than the interpreter, but not
yet as fast as YJIT.
We encourage experimentation with ZJIT, but advise against
deploying it in production for now.
* Our goal is to make ZJIT faster than YJIT and production-ready
in Ruby 4.1.
* YJIT
* `RubyVM::YJIT.runtime_stats`
* `ratio_in_yjit` no longer works in the default build.
Use `--enable-yjit=stats` on `configure` to enable it on
`--yjit-stats`.
* Add `invalidate_everything` to default stats, which is
incremented when every code is invalidated by TracePoint.
* Add `mem_size:` and `call_threshold:` options to `RubyVM::YJIT.enable`.
* RJIT
* `--rjit` is removed. We will move the implementation of the
third-party JIT API
to the [ruby/rjit](https://github.com/ruby/rjit) repository.
See [NEWS](https://docs.ruby-lang.org/en/v4.0.0/NEWS_md.html)
or [commit logs](https://github.com/ruby/ruby/compare/v3_4_0...v4.0.0)
for more details.
With those changes, [3889 files changed, 230769 insertions(+), 297003
deletions(-)](https://github.com/ruby/ruby/compare/v3_4_0...v4.0.0#file_buc…
since Ruby 3.4.0!
Merry Christmas, a Happy New Year, and Happy Hacking with Ruby 4.0!
## Download
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz>
SIZE: 23955109
SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3
SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271
SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz>
SIZE: 18008368
SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602
SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1
SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4
* <https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip>
SIZE: 29253204
SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8
SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455
SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
## What is Ruby
Ruby was first developed by Matz (Yukihiro Matsumoto) in 1993,
and is now developed as Open Source. It runs on multiple platforms
and is used all over the world especially for web development.
[Feature #15408]: https://bugs.ruby-lang.org/issues/15408
[Feature #17473]: https://bugs.ruby-lang.org/issues/17473
[Feature #18455]: https://bugs.ruby-lang.org/issues/18455
[Bug #19112]: https://bugs.ruby-lang.org/issues/19112
[Feature #19630]: https://bugs.ruby-lang.org/issues/19630
[Bug #19868]: https://bugs.ruby-lang.org/issues/19868
[Feature #19908]: https://bugs.ruby-lang.org/issues/19908
[Feature #20610]: https://bugs.ruby-lang.org/issues/20610
[Feature #20724]: https://bugs.ruby-lang.org/issues/20724
[Feature #20750]: https://bugs.ruby-lang.org/issues/20750
[Feature #20884]: https://bugs.ruby-lang.org/issues/20884
[Feature #20925]: https://bugs.ruby-lang.org/issues/20925
[Bug #20968]: https://bugs.ruby-lang.org/issues/20968
[Feature #20971]: https://bugs.ruby-lang.org/issues/20971
[Bug #20974]: https://bugs.ruby-lang.org/issues/20974
[Feature #21047]: https://bugs.ruby-lang.org/issues/21047
[Bug #21049]: https://bugs.ruby-lang.org/issues/21049
[Feature #21166]: https://bugs.ruby-lang.org/issues/21166
[Bug #21174]: https://bugs.ruby-lang.org/issues/21174
[Bug #21175]: https://bugs.ruby-lang.org/issues/21175
[Bug #21185]: https://bugs.ruby-lang.org/issues/21185
[Feature #21205]: https://bugs.ruby-lang.org/issues/21205
[Feature #21216]: https://bugs.ruby-lang.org/issues/21216
[Feature #21219]: https://bugs.ruby-lang.org/issues/21219
[Feature #21254]: https://bugs.ruby-lang.org/issues/21254
[Feature #21258]: https://bugs.ruby-lang.org/issues/21258
[Feature #21268]: https://bugs.ruby-lang.org/issues/21268
[Feature #21262]: https://bugs.ruby-lang.org/issues/21262
[Feature #21275]: https://bugs.ruby-lang.org/issues/21275
[Feature #21287]: https://bugs.ruby-lang.org/issues/21287
[Feature #21311]: https://bugs.ruby-lang.org/issues/21311
[Feature #21347]: https://bugs.ruby-lang.org/issues/21347
[Feature #21360]: https://bugs.ruby-lang.org/issues/21360
[Misc #21385]: https://bugs.ruby-lang.org/issues/21385
[Feature #21389]: https://bugs.ruby-lang.org/issues/21389
[Feature #21390]: https://bugs.ruby-lang.org/issues/21390
[Feature #21459]: https://bugs.ruby-lang.org/issues/21459
[Feature #21527]: https://bugs.ruby-lang.org/issues/21527
[Feature #21543]: https://bugs.ruby-lang.org/issues/21543
[Feature #21550]: https://bugs.ruby-lang.org/issues/21550
[Feature #21552]: https://bugs.ruby-lang.org/issues/21552
[Feature #21557]: https://bugs.ruby-lang.org/issues/21557
[Bug #21633]: https://bugs.ruby-lang.org/issues/21633
[Bug #21654]: https://bugs.ruby-lang.org/issues/21654
[Feature #21678]: https://bugs.ruby-lang.org/issues/21678
[Bug #21698]: https://bugs.ruby-lang.org/issues/21698
[Feature #21701]: https://bugs.ruby-lang.org/issues/21701
[Bug #21789]: https://bugs.ruby-lang.org/issues/21789
[GH-net-http #205]: https://github.com/ruby/net-http/issues/205
[ostruct-v0.6.2]: https://github.com/ruby/ostruct/releases/tag/v0.6.2
[ostruct-v0.6.3]: https://github.com/ruby/ostruct/releases/tag/v0.6.3
[pstore-v0.2.0]: https://github.com/ruby/pstore/releases/tag/v0.2.0
[benchmark-v0.4.1]: https://github.com/ruby/benchmark/releases/tag/v0.4.1
[benchmark-v0.5.0]: https://github.com/ruby/benchmark/releases/tag/v0.5.0
[logger-v1.6.5]: https://github.com/ruby/logger/releases/tag/v1.6.5
[logger-v1.6.6]: https://github.com/ruby/logger/releases/tag/v1.6.6
[logger-v1.7.0]: https://github.com/ruby/logger/releases/tag/v1.7.0
[rdoc-v6.14.1]: https://github.com/ruby/rdoc/releases/tag/v6.14.1
[rdoc-v6.14.2]: https://github.com/ruby/rdoc/releases/tag/v6.14.2
[rdoc-v6.15.0]: https://github.com/ruby/rdoc/releases/tag/v6.15.0
[rdoc-v6.15.1]: https://github.com/ruby/rdoc/releases/tag/v6.15.1
[rdoc-v6.16.0]: https://github.com/ruby/rdoc/releases/tag/v6.16.0
[rdoc-v6.16.1]: https://github.com/ruby/rdoc/releases/tag/v6.16.1
[rdoc-v6.17.0]: https://github.com/ruby/rdoc/releases/tag/v6.17.0
[rdoc-v7.0.0]: https://github.com/ruby/rdoc/releases/tag/v7.0.0
[rdoc-v7.0.1]: https://github.com/ruby/rdoc/releases/tag/v7.0.1
[rdoc-v7.0.2]: https://github.com/ruby/rdoc/releases/tag/v7.0.2
[rdoc-v7.0.3]: https://github.com/ruby/rdoc/releases/tag/v7.0.3
[win32ole-v1.9.2]: https://github.com/ruby/win32ole/releases/tag/v1.9.2
[irb-v1.15.0]: https://github.com/ruby/irb/releases/tag/v1.15.0
[irb-v1.15.1]: https://github.com/ruby/irb/releases/tag/v1.15.1
[irb-v1.15.2]: https://github.com/ruby/irb/releases/tag/v1.15.2
[irb-v1.15.3]: https://github.com/ruby/irb/releases/tag/v1.15.3
[irb-v1.16.0]: https://github.com/ruby/irb/releases/tag/v1.16.0
[reline-v0.6.1]: https://github.com/ruby/reline/releases/tag/v0.6.1
[reline-v0.6.2]: https://github.com/ruby/reline/releases/tag/v0.6.2
[reline-v0.6.3]: https://github.com/ruby/reline/releases/tag/v0.6.3
[fiddle-v1.1.7]: https://github.com/ruby/fiddle/releases/tag/v1.1.7
[fiddle-v1.1.8]: https://github.com/ruby/fiddle/releases/tag/v1.1.8
[date-v3.5.0]: https://github.com/ruby/date/releases/tag/v3.5.0
[date-v3.5.1]: https://github.com/ruby/date/releases/tag/v3.5.1
[delegate-v0.5.0]: https://github.com/ruby/delegate/releases/tag/v0.5.0
[delegate-v0.6.0]: https://github.com/ruby/delegate/releases/tag/v0.6.0
[delegate-v0.6.1]: https://github.com/ruby/delegate/releases/tag/v0.6.1
[digest-v3.2.1]: https://github.com/ruby/digest/releases/tag/v3.2.1
[english-v0.8.1]: https://github.com/ruby/english/releases/tag/v0.8.1
[erb-v5.1.2]: https://github.com/ruby/erb/releases/tag/v5.1.2
[erb-v5.1.3]: https://github.com/ruby/erb/releases/tag/v5.1.3
[erb-v6.0.0]: https://github.com/ruby/erb/releases/tag/v6.0.0
[erb-v6.0.1]: https://github.com/ruby/erb/releases/tag/v6.0.1
[fcntl-v1.3.0]: https://github.com/ruby/fcntl/releases/tag/v1.3.0
[fileutils-v1.8.0]: https://github.com/ruby/fileutils/releases/tag/v1.8.0
[forwardable-v1.4.0]: https://github.com/ruby/forwardable/releases/tag/v1.4.0
[io-console-v0.8.2]: https://github.com/ruby/io-console/releases/tag/v0.8.2
[io-wait-v0.3.3]: https://github.com/ruby/io-wait/releases/tag/v0.3.3
[io-wait-v0.3.5.test1]:
https://github.com/ruby/io-wait/releases/tag/v0.3.5.test1
[io-wait-v0.3.5]: https://github.com/ruby/io-wait/releases/tag/v0.3.5
[io-wait-v0.3.6]: https://github.com/ruby/io-wait/releases/tag/v0.3.6
[io-wait-v0.4.0]: https://github.com/ruby/io-wait/releases/tag/v0.4.0
[json-v2.10.0]: https://github.com/ruby/json/releases/tag/v2.10.0
[json-v2.10.1]: https://github.com/ruby/json/releases/tag/v2.10.1
[json-v2.10.2]: https://github.com/ruby/json/releases/tag/v2.10.2
[json-v2.11.0]: https://github.com/ruby/json/releases/tag/v2.11.0
[json-v2.11.1]: https://github.com/ruby/json/releases/tag/v2.11.1
[json-v2.11.2]: https://github.com/ruby/json/releases/tag/v2.11.2
[json-v2.11.3]: https://github.com/ruby/json/releases/tag/v2.11.3
[json-v2.12.0]: https://github.com/ruby/json/releases/tag/v2.12.0
[json-v2.12.1]: https://github.com/ruby/json/releases/tag/v2.12.1
[json-v2.12.2]: https://github.com/ruby/json/releases/tag/v2.12.2
[json-v2.13.0]: https://github.com/ruby/json/releases/tag/v2.13.0
[json-v2.13.1]: https://github.com/ruby/json/releases/tag/v2.13.1
[json-v2.13.2]: https://github.com/ruby/json/releases/tag/v2.13.2
[json-v2.14.0]: https://github.com/ruby/json/releases/tag/v2.14.0
[json-v2.14.1]: https://github.com/ruby/json/releases/tag/v2.14.1
[json-v2.15.0]: https://github.com/ruby/json/releases/tag/v2.15.0
[json-v2.15.1]: https://github.com/ruby/json/releases/tag/v2.15.1
[json-v2.15.2]: https://github.com/ruby/json/releases/tag/v2.15.2
[json-v2.16.0]: https://github.com/ruby/json/releases/tag/v2.16.0
[json-v2.17.0]: https://github.com/ruby/json/releases/tag/v2.17.0
[json-v2.17.1]: https://github.com/ruby/json/releases/tag/v2.17.1
[json-v2.18.0]: https://github.com/ruby/json/releases/tag/v2.18.0
[net-http-v0.7.0]: https://github.com/ruby/net-http/releases/tag/v0.7.0
[net-http-v0.8.0]: https://github.com/ruby/net-http/releases/tag/v0.8.0
[net-http-v0.9.0]: https://github.com/ruby/net-http/releases/tag/v0.9.0
[net-http-v0.9.1]: https://github.com/ruby/net-http/releases/tag/v0.9.1
[openssl-v3.3.2]: https://github.com/ruby/openssl/releases/tag/v3.3.2
[openssl-v4.0.0]: https://github.com/ruby/openssl/releases/tag/v4.0.0
[optparse-v0.7.0]: https://github.com/ruby/optparse/releases/tag/v0.7.0
[optparse-v0.8.0]: https://github.com/ruby/optparse/releases/tag/v0.8.0
[optparse-v0.8.1]: https://github.com/ruby/optparse/releases/tag/v0.8.1
[pp-v0.6.3]: https://github.com/ruby/pp/releases/tag/v0.6.3
[prism-v1.6.0]: https://github.com/ruby/prism/releases/tag/v1.6.0
[prism-v1.7.0]: https://github.com/ruby/prism/releases/tag/v1.7.0
[psych-v5.2.3]: https://github.com/ruby/psych/releases/tag/v5.2.3
[psych-v5.2.4]: https://github.com/ruby/psych/releases/tag/v5.2.4
[psych-v5.2.5]: https://github.com/ruby/psych/releases/tag/v5.2.5
[psych-v5.2.6]: https://github.com/ruby/psych/releases/tag/v5.2.6
[psych-v5.3.0]: https://github.com/ruby/psych/releases/tag/v5.3.0
[psych-v5.3.1]: https://github.com/ruby/psych/releases/tag/v5.3.1
[resolv-v0.6.3]: https://github.com/ruby/resolv/releases/tag/v0.6.3
[resolv-v0.7.0]: https://github.com/ruby/resolv/releases/tag/v0.7.0
[stringio-v3.1.3]: https://github.com/ruby/stringio/releases/tag/v3.1.3
[stringio-v3.1.4]: https://github.com/ruby/stringio/releases/tag/v3.1.4
[stringio-v3.1.5]: https://github.com/ruby/stringio/releases/tag/v3.1.5
[stringio-v3.1.6]: https://github.com/ruby/stringio/releases/tag/v3.1.6
[stringio-v3.1.7]: https://github.com/ruby/stringio/releases/tag/v3.1.7
[stringio-v3.1.8]: https://github.com/ruby/stringio/releases/tag/v3.1.8
[stringio-v3.1.9]: https://github.com/ruby/stringio/releases/tag/v3.1.9
[stringio-v3.2.0]: https://github.com/ruby/stringio/releases/tag/v3.2.0
[strscan-v3.1.3]: https://github.com/ruby/strscan/releases/tag/v3.1.3
[strscan-v3.1.4]: https://github.com/ruby/strscan/releases/tag/v3.1.4
[strscan-v3.1.5]: https://github.com/ruby/strscan/releases/tag/v3.1.5
[strscan-v3.1.6]: https://github.com/ruby/strscan/releases/tag/v3.1.6
[time-v0.4.2]: https://github.com/ruby/time/releases/tag/v0.4.2
[timeout-v0.4.4]: https://github.com/ruby/timeout/releases/tag/v0.4.4
[timeout-v0.5.0]: https://github.com/ruby/timeout/releases/tag/v0.5.0
[timeout-v0.6.0]: https://github.com/ruby/timeout/releases/tag/v0.6.0
[uri-v1.1.0]: https://github.com/ruby/uri/releases/tag/v1.1.0
[uri-v1.1.1]: https://github.com/ruby/uri/releases/tag/v1.1.1
[weakref-v0.1.4]: https://github.com/ruby/weakref/releases/tag/v0.1.4
[zlib-v3.2.2]: https://github.com/ruby/zlib/releases/tag/v3.2.2
[power_assert-v3.0.0]: https://github.com/ruby/power_assert/releases/tag/v3.0.0
[power_assert-v3.0.1]: https://github.com/ruby/power_assert/releases/tag/v3.0.1
[rake-v13.3.0]: https://github.com/ruby/rake/releases/tag/v13.3.0
[rake-v13.3.1]: https://github.com/ruby/rake/releases/tag/v13.3.1
[test-unit-3.6.8]: https://github.com/test-unit/test-unit/releases/tag/3.6.8
[test-unit-3.6.9]: https://github.com/test-unit/test-unit/releases/tag/3.6.9
[test-unit-3.7.0]: https://github.com/test-unit/test-unit/releases/tag/3.7.0
[test-unit-3.7.1]: https://github.com/test-unit/test-unit/releases/tag/3.7.1
[test-unit-3.7.2]: https://github.com/test-unit/test-unit/releases/tag/3.7.2
[test-unit-3.7.3]: https://github.com/test-unit/test-unit/releases/tag/3.7.3
[test-unit-3.7.4]: https://github.com/test-unit/test-unit/releases/tag/3.7.4
[test-unit-3.7.5]: https://github.com/test-unit/test-unit/releases/tag/3.7.5
[rss-0.3.2]: https://github.com/ruby/rss/releases/tag/0.3.2
[net-ftp-v0.3.9]: https://github.com/ruby/net-ftp/releases/tag/v0.3.9
[net-imap-v0.5.9]: https://github.com/ruby/net-imap/releases/tag/v0.5.9
[net-imap-v0.5.10]: https://github.com/ruby/net-imap/releases/tag/v0.5.10
[net-imap-v0.5.11]: https://github.com/ruby/net-imap/releases/tag/v0.5.11
[net-imap-v0.5.12]: https://github.com/ruby/net-imap/releases/tag/v0.5.12
[net-imap-v0.5.13]: https://github.com/ruby/net-imap/releases/tag/v0.5.13
[net-imap-v0.6.0]: https://github.com/ruby/net-imap/releases/tag/v0.6.0
[net-imap-v0.6.1]: https://github.com/ruby/net-imap/releases/tag/v0.6.1
[net-imap-v0.6.2]: https://github.com/ruby/net-imap/releases/tag/v0.6.2
[net-smtp-v0.5.1]: https://github.com/ruby/net-smtp/releases/tag/v0.5.1
[matrix-v0.4.3]: https://github.com/ruby/matrix/releases/tag/v0.4.3
[prime-v0.1.4]: https://github.com/ruby/prime/releases/tag/v0.1.4
[rbs-v3.8.1]: https://github.com/ruby/rbs/releases/tag/v3.8.1
[rbs-v3.9.0.dev.1]: https://github.com/ruby/rbs/releases/tag/v3.9.0.dev.1
[rbs-v3.9.0.pre.1]: https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.1
[rbs-v3.9.0.pre.2]: https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.2
[rbs-v3.9.0]: https://github.com/ruby/rbs/releases/tag/v3.9.0
[rbs-v3.9.1]: https://github.com/ruby/rbs/releases/tag/v3.9.1
[rbs-v3.9.2]: https://github.com/ruby/rbs/releases/tag/v3.9.2
[rbs-v3.9.3]: https://github.com/ruby/rbs/releases/tag/v3.9.3
[rbs-v3.9.4]: https://github.com/ruby/rbs/releases/tag/v3.9.4
[rbs-v3.9.5]: https://github.com/ruby/rbs/releases/tag/v3.9.5
[rbs-v3.10.0.pre.1]: https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.1
[rbs-v3.10.0.pre.2]: https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.2
[rbs-v3.10.0]: https://github.com/ruby/rbs/releases/tag/v3.10.0
[debug-v1.11.1]: https://github.com/ruby/debug/releases/tag/v1.11.1
[base64-v0.3.0]: https://github.com/ruby/base64/releases/tag/v0.3.0
[bigdecimal-v3.2.0]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.0
[bigdecimal-v3.2.1]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.1
[bigdecimal-v3.2.2]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.2
[bigdecimal-v3.2.3]: https://github.com/ruby/bigdecimal/releases/tag/v3.2.3
[bigdecimal-v3.3.0]: https://github.com/ruby/bigdecimal/releases/tag/v3.3.0
[bigdecimal-v3.3.1]: https://github.com/ruby/bigdecimal/releases/tag/v3.3.1
[bigdecimal-v4.0.0]: https://github.com/ruby/bigdecimal/releases/tag/v4.0.0
[bigdecimal-v4.0.1]: https://github.com/ruby/bigdecimal/releases/tag/v4.0.1
[drb-v2.2.3]: https://github.com/ruby/drb/releases/tag/v2.2.3
[syslog-v0.3.0]: https://github.com/ruby/syslog/releases/tag/v0.3.0
[csv-v3.3.3]: https://github.com/ruby/csv/releases/tag/v3.3.3
[csv-v3.3.4]: https://github.com/ruby/csv/releases/tag/v3.3.4
[csv-v3.3.5]: https://github.com/ruby/csv/releases/tag/v3.3.5
1
0
みなさんこんにちは。neko314@るびま編集部です。
日本 Ruby の会有志によるウェブ雑誌「Rubyist Magazine」
通称『るびま』の 0065 号をリリースしましたのでお知らせします。
今後とも Rubyist Magazine をご愛読いただけると幸いです。
0065号 (2025-12)
https://magazine.rubyist.net/articles/0065/index.html
* 巻頭言
* FirstStepRuby
* RegionalRubyKaigi レポート (85) 福岡 Rubyist 会議 04
* RegionalRubyKaigi レポート (86) TokyuRuby 会議 15 レポート
* RegionalRubyKaigi レポート (87) 松江 Ruby 会議 11
* 日報が面倒なので、Ruby と Google Gemini を使って生成するツールを作成しました
* RegionalRubyKaigi レポート (88) 大阪 Ruby 会議 03
* RegionalRubyKaigi レポート (89) 大阪 Ruby 会議 04
* RegionalRubyKaigi レポート (88) 東京 Ruby 会議 12
* Kaigi on Rails 2024 開催レポート
* RubyKaigi 2025 スピーカーからのメッセージ
* Rails Girls Nagasaki 2nd 開催レポート
* あなたもできる「超絶技巧 Ruby 意味不明コーディング」ことはじめ
* Ruby リリース 30 周年に寄せて
* RubyEventCheck
* 0065 号 編集後記
1
0
こんにちは、Tokyu.rbの関と申します。
# このお知らせはRuby関連のMLやfacebookグループに送らせていただいております。
# 重複して受け取られた方はご容赦ください。
来る 11/29(土) (いい肉の日)に TokyuRuby 会議16 を開催する運びとなりました。
TokyuRuby会議とは、東京で開催される Regional RubyKaigi の一つであり、 Ruby
に興味を持つエンジニアが集う Tokyu.rb 主催の LT 大会です。
飲み食いしつつ、みんなでライトニングトーク(LT)
をして盛り上がろうというイベントです。
つきましては、以下の要領で LT 発表者を募集します。
- テーマは自由 (発表のどこかに「Ruby」が入っていれば OK)
- 制限時間は 5 分
発表されたい方は、以下のフォームからご登録ください。
https://forms.gle/GNL7szrpPGC7GKY49
応募者多数の場合は運営にて抽選させていただきますので、予めご了承くださいませ。
募集の締切は2025年10月26日(日)23:59(JST)を予定しています。
なお、開催の概要は以下の通りです。
- 会期: 2025/11/29(土) 13:30開場/19:30終了(予定)
- 会場: GMOインターネットグループ グループ第2本社 GMO Yours・フクラス
東京都渋谷区道玄坂1丁目2番3号 渋谷フクラス 16階
- 参加費: 無料
- 定員: 60名程度
詳細は以下サイトを参照してください。
https://tokyurubykaigi.github.io/tokyu16/
その他、ご質問やお問い合わせは tokyurubykaigi(a)googlegroups.com
までご連絡ください。
よろしくお願いいたします。
1
0
[ruby-list:51031] Gem::Specification#normalize from Ruby 3.4.3 and later
by Takahiro Kambe 14 Jun '25
by Takahiro Kambe 14 Jun '25
14 Jun '25
こんにちは。
pkgsrc方面で devel/ruby-google-protobuf の作成が ruby34 (Ruby 3.4.x)で
エラーになると報告があって調べてみたのですが、
google-protobufのgemspecファイルでは、
s.extensions = ["ext/google/protobuf_c/extconf.rb".freeze, "ext/google/protobuf_c/Rakefile".freeze]
という記述があり、これは Gem::Specification の@extensionsとなります。
そして、google-protobufのgemは、この順序で拡張のビルドを行わなう前提と
なっているようです。
ところが、3月20日に、
https://github.com/rubygems/rubygems/commit/792117980b
変更された内容をRubyGems 3.6.7をマージしたRuby 3.4.3以降では
Gem::Specification#noemalizeで@extensionsをソートしています。
そうすると、google-protobufは@extensionsの順序が判定してしまって、結果
としてエラーになっている状況でした。
順序に依存しているgoogle-protobuf gemの方の問題なのかどうか、その辺り
はわかりませんが、pkgsrcではruby34のlib/rubygems/specification.rbを
修正して解決しました。
正しい解決方法はわかっていませんが、以上報告でした。
--
神戸 隆博 / Takahiro Kambe
1
0
こんにちは。三上です。初参加です。よろしくお願いします。
1
0
Ruby 3.4.0 が公開されました。Ruby 3.4では、ブロックパラメータ参照の `it` の追加、
デフォルトパーサーのPrismへの変更、Socket ライブラリの Happy Eyeballs Version 2 (RFC 8305)
対応、YJITの改善、
Modular GCの導入など様々な改善が行われています。
## `it` の追加
ブロックパラメータに名前をつけずに参照する `it` が追加されました。 [[Feature #18980]]
```ruby
ary = ["foo", "bar", "baz"]
p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]
```
`it` は `_1` とほとんど同じように動作します。ブロック内で `_1` のみを使用する意図がある場合に `_1` を使うと、`_2`
や `_3` などの他の番号付きパラメータが現れる可能性が示唆され、認知的負荷が高い問題がありました。そのため、`it`
は便利なエイリアスとして導入されました。一行ブロックなど、`it`の意味が一目でわかる簡単なケースにご利用ください。
## デフォルトのパーサをPrismに変更
デフォルトで使用するパーサーを parse.y から生成するパーサーから Prism へと変更しました。 [[Feature #20564]]
これは内部的な改善であり、ユーザーにはほとんど変化が見られないはずです。互換性の問題にお気づきの場合は、ご報告ください。
従来のパーサーを使用するにはコマンドライン引数 `--parser=parse.y` を使用してください。
## Socket ライブラリの Happy Eyeballs Version 2 (RFC 8305) 対応
Socket ライブラリの `TCPSocket.new` (`TCPSocket.open`) と `Socket.tcp`
が多数のプログラミング言語で、より良いネットワーク接続の方法として広く標準採用されている [Happy Eyeballs Version 2
(RFC 8305)](https://datatracker.ietf.org/doc/html/rfc8305)
に対応しました。この改善により、Ruby は IPv6 と IPv4
が混在するような最新のインターネット環境においても、効率的で信頼性の高いネットワーク接続が可能となりました。
Ruby 3.3 までは上記の2つのメソッドは名前解決と接続試行をシリアルに実行していました。Happy Eyeballs Version
2 のアルゴリズムでは以下のように実行します。
1. IPv6とIPv4の名前解決を同時実行する。
2. 解決されたIPアドレスへの接続を、IPv6を優先して、250ミリ秒間隔で並行して試みる。
3. 最初に成功した接続を返し、他の接続はキャンセルする。
このアルゴリズムによって、特定のプロトコルや IP アドレスが遅延したり利用できない場合でも、接続遅延を最小限に抑えることが可能となります。
この機能は標準で有効になるため、追加の設定は必要ありません。Ruby 全体で無効にしたい場合は環境変数として
`RUBY_TCP_NO_FAST_FALLBACK=1` を設定するか、`Socket.tcp_fast_fallback=false`
を Ruby プログラムの中で呼び出してください。またはメソッド単位で無効化する場合、`TCPSocket.new`
(`TCPSocket.open`) と `Socket.tcp` のキーワード引数として `fast_fallback: false`
を利用してください。
## YJIT
### TL;DR
* x86-64 と arm64 の両方のプラットフォームにおいて、ほとんどのベンチマークのパフォーマンスが向上しました。
* メタデータの圧縮と統一的なメモリ使用量制限によりメモリ使用量を削減しました。
* 様々な不具合修正: YJIT はより堅牢になり、より多くの環境でテストされました。
### 新機能
* コマンドラインオプション
* `--yjit-mem-size` による統一的なメモリ制限が指定可能になりました(デフォルトは 128MiB)。
このオプションはすべての YJIT のメモリ使用量を監視し、従来の `--yjit-exec-mem-size`
オプションよりも直感的に使用できます。
* `--yjit-log` オプションを用いて、コンパイルログを監視できるようになりました。
* Ruby API
* `RubyVM::YJIT.log` を用いてコンパイルログの末尾を取得することができるようになりました。
* YJIT の統計情報
* `RubyVM::YJIT.runtime_stats`
からインバリデーション、インライン化、メタデータエンコーディングに関する追加の統計情報をいつでも取得できるようになりました。
### 新しい最適化
* コンテキストの圧縮化により YJIT のメタデータ保管に必要なメモリを削減しました。
* ローカル変数やRubyのメソッドの引数のためにレジスタを割り当てるようになりました。
* YJIT が有効な場合に Ruby で実装されたコアクラスを使うようになりました。
* Ruby で書き直された `Array#each`, `Array#select`, `Array#map`
はより良いパフォーマンスを提供します。 [[Feature #20182]].
* 以下のような小さいメソッドをインライン化できるようになりました:
* 空メソッド
* 定数を返すメソッド
* `self` を返すメソッド
* 引数を直接返すメソッド
* 組み込みメソッドに特化したコード生成の対象を広げました
* `String#getbyte`, `String#setbyte` など、String のメソッドの最適化を行いました。
* 低レベルの bit/byte 操作を高速化するためにビット演算を最適化しました
* マルチ Ractor モードにおける定数共有をサポートしました。
* その他、様々な段階的な最適化を行いました。
## Modular GC
* Modular GC 機能により Ruby 標準とは異なる ガベージ・コレクタ (GC)
の実装を動的にロードすることができるようになりました。この機能を使うには Ruby をビルドする時に `--with-modular-gc`
を指定してください。GC ライブラリは環境変数 `RUBY_GC_LIBRARY` を用いて Ruby
のランタイムにロードすることができます。[[Feature #20351]]
* Ruby 組み込みのガベージ・コレクタは `gc/default/default.c` ファイルに分割され、 Ruby
ランタイムとのやりとりは `gc/gc_impl.h` に定義される API を用いて行われます。組み込みのガベージコレクタは `make
modular-gc MODULAR_GC=default` というコマンドを用いてライブラリとしてもビルドすることができ、環境変数として
`RUBY_GC_LIBRARY=default` を定義することで有効にすることができます。 [[Feature #20470]]
* [MMTk](https://www.mmtk.io/) をベースとした実験的な GC
ライブラリが提供されました。このライブラリは`make modular-gc MODULAR_GC=mmtk`
コマンドによってビルドし、環境変数 `RUBY_GC_LIBRARY=mmtk`
によって有効化します。この機能を使うにはビルドを行うマシンに Rust のビルドツールを必要とします。 [[Feature #20860]]
## 言語機能の変更
* マジックコメント `frozen_string_literal` のないファイル中の文字列リテラルは、freeze
されているかのように振る舞うようになり、破壊的な変更時に警告を表示するようになりました。これらの警告はコマンドラインオプション
`-W:deprecated` か Ruby プログラムで `Warning[:deprecated] = true`
を指定すると表示されます。
これら無効にするにはコマンドラインオプション `--disable-frozen-string-literal` を追加して Ruby
を実行してください。 [[Feature #20205]]
* メソッド呼び出し時の `nil` 展開キーワードがサポートされました。
`**nil` は `**{}` と同様に扱われ、キーワードは渡せません。
また、あらゆる変換のためのメソッドも呼ばれません。[[Bug #20064]]
* インデックスにブロックを渡せなくなりました。[[Bug #19918]]
* インデックスにキーワード引数を渡せなくなりました。[[Bug #20218]]
* トップレベルに `::Ruby` を予約しました。
`Warning[:deprecated]` が有効な場合、既に定義済みの場合は警告されます。[[Feature #20884]]
## コアクラスのアップデート
注: 複数のアップデートの中から注目すべきアップデートのみを掲載しています。
* Exception
* `Exception#set_backtrace` は `Thread::Backtrace::Location` の配列を受け取れる様になりました。.
`Kernel#raise`, `Thread#raise` や `Fiber#raise`
も同じ配列を受け取れます。[[Feature #13557]]
* GC
* `GC.config` がガベージ・コレクタの設定変更を可能とするために追加されました。[[Feature #20443]]
* GC の設定用のパラメータとして `rgengc_allow_full_mark` が追加されました。このパラメータを `false`
とすると、GC は young オブジェクトのみを GC 用にマークします。デフォルト値は `true` です。
[[Feature #20443]]
* Ractor
* Ractor の中で `require` が可能となりました。この `require` の処理はメインの Ractor で行われます。
また、メインの Ractor には `require` 処理のために `Ractor._require(feature)` が追加されました。
[[Feature #20627]]
* `Ractor.main?` が追加されました。[[Feature #20627]]
* 現在実行中の Ractor の Ractor ローカルストレージにアクセスするためのメソッドとして `Ractor.[]`
and `Ractor.[]=` が追加されました。 [[Feature #20715]]
* スレッドセーフに Ractor ローカル変数を初期化するためのメソッド
`Ractor.store_if_absent(key){ init }` が追加されました。 [[Feature #20875]]
* Range
* `Range#size` は範囲オブジェクトが反復可能ではない場合は `TypeError` 例外を出すようになりました。[[Misc #18984]]
## 標準ライブラリのアップデート
注: 複数のアップデートの中から注目すべき標準ライブラリのアップデートのみを掲載しています。
* RubyGems
* `gem push` コマンドに `--attestation` オプションが追加されました。このオプションをつけると
[sigstore](https://www.sigstore.dev/) に gem の署名情報が保存されます。
* Bundler
* ロックファイルの新規作成時に gem の checksum を保存する `lockfile_checksums` オプションが
`bundle config` に設定可能になりました。
* 既存のロックファイルに使用している gem の checksum を付与するためのコマンドとして `bundle lock
--add-checksums` が追加されました。
* JSON
* `JSON.parse` が Ruby 3.3 シリーズに添付されている json-2.7.x と比較して 1.5 倍程度高速になりました。
* Tempfile
* `Tempfile.create` に `anonymous: true` キーワードが追加されました。is implemented for .
`Tempfile.create(anonymous: true)`
は作成した一時ファイルを即座に削除します。この機能を用いることで、アプリケーションは独自にファイル削除を行う必要がなくなります。
[[Feature #20497]]
* win32/sspi.rb
* Windows で SSPI 機能を提供するライブラリは Ruby のリポジトリから [ruby/net-http-sspi]
に移動しました。 [[Feature #20775]]
## 互換性に関する変更
注: 不具合修正を除きます。
* エラーメッセージとして表示するバックトレースを変更しました。
* 開始の引用符は backtick の代わりにシングルクォートを用いるようになりました。[[Feature #16495]]
* クラス名が変更しないような場合、メソッド名の前にクラス名を表示するようになりました。[[Feature #19117]]
* `Kernel#caller`, `Thread::Backtrace::Location` などのメソッドはそれらに応じて変更されました。
```
Old:
test.rb:1:in `foo': undefined method `time' for an instance of Integer
from test.rb:2:in `<main>'
New:
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
from test.rb:2:in '<main>'
```
* `Hash#inspect` の表示が変わりました。[[Bug #20433]]
* Symbol キーはコロンを用いたモダンな表示になりました: `"{user: 1}"`
* 他のキーは従来の `'{"user"=>1}'` とは異なり、 `=>` の前後にスペースを含む表示になりました:
`'{"user" => 1}'`。
* `Kernel#Float()` は 10 進表記の小数部がなくても受け付けるようになりました。 [[Feature #20705]]
```rb
Float("1.") #=> 1.0 (previously, an ArgumentError was raised)
Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
```
* `String#to_f` は 10
進表記の小数部がなくても受け付けるようになりました。指数を指定すると従来とは結果が変わることに注意してください。 [[Feature
#20705]]
```rb
"1.".to_f #=> 1.0
"1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
```
* `Refinement#refined_class` は削除されました。[[Feature #19714]]
## 標準ライブラリの互換性の変更
* DidYouMean
* `DidYouMean::SPELL_CHECKERS[]=` と
`DidYouMean::SPELL_CHECKERS.merge!` は削除されました。
* Net::HTTP
* 2012 年から非推奨とされている以下の定数が削除されました。
* `Net::HTTP::ProxyMod`
* `Net::NetPrivate::HTTPRequest`
* `Net::HTTPInformationCode`
* `Net::HTTPSuccessCode`
* `Net::HTTPRedirectionCode`
* `Net::HTTPRetriableCode`
* `Net::HTTPClientErrorCode`
* `Net::HTTPFatalErrorCode`
* `Net::HTTPServerErrorCode`
* `Net::HTTPResponseReceiver`
* `Net::HTTPResponceReceiver`
* 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]]
## その他の変更点
* 渡されたブロックを使用しないメソッドにブロックを渡すと、verboseモード(`-w`)
で警告が表示されるようになりました。[[Feature #15554]]
* `String.freeze` や `Integer#+` のような JIT
とインタプリタによって特別に最適化されたメソッドを再定義すると、performance 警告(`-W:performance`
または`Warning[:performance] = true` で有効化)が表示されるようになりました。 [[Feature
#20429]]
より詳細な情報は [NEWS](https://github.com/ruby/ruby/blob/v3_4_0/NEWS.md)
か [commit logs](https://github.com/ruby/ruby/compare/v3_3_0...v3_4_0) を参照してください。
これらの変更により、Ruby 3.3.0から [4942 ファイルが変更され、 202244 行が追加され、 255528
行が削除されました!deletions(-)](https://github.com/ruby/ruby/compare/v3_3_0...v3_4_…
メリークリスマス、Ruby 3.4 とともによいお年をお迎えください!
## Download
* <https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz>
SIZE: 23153022
SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
* <https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz>
SIZE: 17215572
SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
* <https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip>
SIZE: 28310193
SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
## What is Ruby
Rubyはまつもとゆきひろ (Matz)
によって1993年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。Rubyは様々なプラットフォームで動き、世界中で、特にWebアプリケーション開発のために使われています。
[Feature #13557]: https://bugs.ruby-lang.org/issues/13557
[Feature #15554]: https://bugs.ruby-lang.org/issues/15554
[Feature #16495]: https://bugs.ruby-lang.org/issues/16495
[Feature #18290]: https://bugs.ruby-lang.org/issues/18290
[Feature #18980]: https://bugs.ruby-lang.org/issues/18980
[Misc #18984]: https://bugs.ruby-lang.org/issues/18984
[Feature #19117]: https://bugs.ruby-lang.org/issues/19117
[Bug #19266]: https://bugs.ruby-lang.org/issues/19266
[Feature #19714]: https://bugs.ruby-lang.org/issues/19714
[Bug #19918]: https://bugs.ruby-lang.org/issues/19918
[Bug #20064]: https://bugs.ruby-lang.org/issues/20064
[Feature #20182]: https://bugs.ruby-lang.org/issues/20182
[Feature #20205]: https://bugs.ruby-lang.org/issues/20205
[Bug #20218]: https://bugs.ruby-lang.org/issues/20218
[Feature #20265]: https://bugs.ruby-lang.org/issues/20265
[Feature #20351]: https://bugs.ruby-lang.org/issues/20351
[Feature #20429]: https://bugs.ruby-lang.org/issues/20429
[Feature #20443]: https://bugs.ruby-lang.org/issues/20443
[Feature #20470]: https://bugs.ruby-lang.org/issues/20470
[Feature #20497]: https://bugs.ruby-lang.org/issues/20497
[Feature #20564]: https://bugs.ruby-lang.org/issues/20564
[Bug #20620]: https://bugs.ruby-lang.org/issues/20620
[Feature #20627]: https://bugs.ruby-lang.org/issues/20627
[Feature #20705]: https://bugs.ruby-lang.org/issues/20705
[Feature #20715]: https://bugs.ruby-lang.org/issues/20715
[Feature #20775]: https://bugs.ruby-lang.org/issues/20775
[Bug #20795]: https://bugs.ruby-lang.org/issues/20795
[Feature #20860]: https://bugs.ruby-lang.org/issues/20860
[Feature #20875]: https://bugs.ruby-lang.org/issues/20875
[Feature #20884]: https://bugs.ruby-lang.org/issues/20884
[sigstore.dev]: sigstore.dev
[ruby/net-http-sspi]: https://github.com/ruby/net-http-sspi
1
0
こんばんわ、Tokyu.rbの関と申します。
# このお知らせはRuby関連のMLやfacebookグループに送らせていただいております。
# 重複して受け取られた方はご容赦ください。
来る 9/29(日) に TokyuRuby 会議15 を開催する運びとなりました。
TokyuRuby会議とは、東京で開催される Regional RubyKaigi の一つであり、 Ruby
に興味を持つエンジニアが集う Tokyu.rb 主催の LT 大会です。
飲み食いしつつ、みんなでライトニングトーク(LT)
をして盛り上がろうというイベントです。
つきましては、以下の要領で LT 発表者を募集します。
- テーマは自由 (発表のどこかに「Ruby」が入っていれば OK)
- 制限時間は 5 分
発表されたい方は、以下のフォームからご登録ください。
https://docs.google.com/forms/d/e/1FAIpQLSfTgSc_semrDVMlxehnAbrVPpgBWdbojto…
応募者多数の場合は運営にて抽選させていただきますので、予めご了承くださいませ。
募集の締切は2024年8月26日(月)23:59(JST)を予定しています。
なお、開催の概要は以下の通りです。
- 会期: 2024/9/29(日) 13:30開場/19:30終了(予定)
- 会場: GMOインターネットグループ株式会社様
- 会場は渋谷フクラスの方になります。
- 住所: 東京都渋谷区道玄坂1丁目2−3 渋谷フクラス 16階 GMO Yours・フクラス
-
- 参加費: 無料
- 定員: 40名程度
詳細は以下サイトを参照してください。
https://tokyurubykaigi.github.io/tokyu15/
その他、ご質問やお問い合わせは tokyurubykaigi(a)googlegroups.com
までご連絡ください。
よろしくお願いいたします。
1
0
Hello,
Verify this Email Routing address to begin receiving forwarded emails by clicking the verify email address link
Account Name: Ruby Association
https://dash.cloudflare.com/email_fwdr/verify?token=_VZbejQS7Ipy9ASGRrDXW-U…
Once you have verified this email address, manage your Email Routing
addresses at https://dash.cloudflare.com/?to=/:account/:zone/email
We appreciate your help in building a better Internet.
Thank you,
Cloudflare
If you believe you received this email in error, please contact dash.cloudflare.com/support
1
0
大谷ともうします。
PHPで、if(!$x = 〜〜〜) という記述を見つけ、
「PHPではこんなのがエラーにならないんだ」と思ったのですが、
念のため、Rubyで
!x = 123
をやってみると、Rubyでもエラーにならず false になります。
演算子の優先度を考えると、これは、
(!x) = 123
の意味になって構文エラーになるはずと思ったのですが、
!(x = 123)
と見なされているようです。単項演算子 + - でも同様ですね。
これはさすがにバグじゃなくて意図的な仕様だと思うのですが、
演算子優先度の例外を作ってまで、
!(x = 123)
-(x = 123)
+(x = 123)
と見做したいという理由があったのでしょうか?
ふとした疑問ですが、ご存じの方、よろしくお願いします。
--
tksotn
3
2