123456789_123456789_123456789_123456789_123456789_

NEWS for Ruby 4.0.0

This document is a list of user-visible feature changes since the 3.4.0 release, except for bug fixes.

Note that each entry is kept to a minimum, see links for details.

Language changes

Core classes updates

Note: We're only listing outstanding class updates.

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.

The following default gem is added.

The following default gems are updated.

The following bundled gems are updated.

RubyGems and Bundler

Ruby 4.0 bundled RubyGems and Bundler version 4. see the following links for details.

Supported platforms

Compatibility issues

Stdlib compatibility issues

C API updates

Implementation improvements

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.

JIT

[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