NEWS for Ruby 4.1.0
This document is a list of user-visible feature changes since the 4.0.0 release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
Language changes
-
Module#cloneandModule#dupno longer rewrite the lexical scope of copied methods. Constants and class variables resolve through the original class, consistent with inheritance and mixins. [Feature #21981]
Core classes updates
Note: We’re only listing outstanding class updates.
-
C API
-
RB_NOGVL_PENDING_INTR_FAILis added as a flag forrb_nogvl.rb_nogvldoes not enter the blocking region (and does not call the given function), returning0, if the current thread has pending interrupts, including interrupts masked byThread.handle_interrupt. As with the existing skip path,errnois0because the function was never called.
-
-
-
Array#packaccepts new formatsRandrfor unsigned and signed LEB128 encoded integers. [Feature #21785] -
Array#packaccepts new formatsx!and@!to align the current offset to a byte boundary or to the ABI alignment of another directive. [Feature #22185]
-
-
-
ENV.fetch_valuesis added. It returns an array of values for the given names, raisingKeyErrorfor missing names unless a block is given. [Feature #21781]
-
-
-
Integer#bit_countis added. It returns the number of1bits in the binary representation of a non-negative integer (its population count). [Feature #20163]
-
-
-
Kernel#autoload_relativeandModule#autoload_relativeare added. These methods work likeautoload, but resolve the file path relative to the file where the method is called, similar torequire_relative. This makes it easier to autoload constants from files in the same directory without hardcoding absolute paths or manipulating$LOAD_PATH. [Feature #15330]
-
-
-
MatchData#integer_atis added. It converts the matched substring to integer and return the result. [Feature #21932]
-
-
-
ObjectSpace._id2refwas removed. [Feature #22135]
-
-
-
Proc#refinedis added. It returns a newProcthat behaves like the receiver but with the refinements activated by the given modules in effect inside its body, without affecting the originalProc. [Feature #22097]
-
-
-
Range#clampis added. It returns a newRangeinstance whose begin and end values are clamped to the given bounds. [Feature #22175]
-
-
-
All instances of
Regexpare now frozen, not just literals. Subclasses ofRegexpare not frozen for compatibility. [Feature #8948]
-
-
Set
-
A deprecated behavior,
Set#to_set,Range#to_set, andEnumerable#to_setaccepting arguments, was removed. [Feature #21390]
-
-
-
String#unpackandString#unpack1accept new formatsRandrfor unsigned and signed LEB128 encoded integers. [Feature #21785] -
String#unpackandString#unpack1accept a new format^that returns the current offset. Useful when combined with variable width formats like LEB128. [Feature #21796] -
String#unpackandString#unpack1accept new formatsx!and@!to align the current offset to a byte boundary or to the ABI alignment of another directive. [Feature #22185]
-
-
-
Symbol#to_snow returns a frozen string. [Feature #22137]
-
Stdlib updates
-
-
An experimental libfyaml backend has been added. It is only enabled when psych is built with
--enable-libfyaml, and the default libyaml backend remains unchanged otherwise. It is not supported on Windows. [GH-psych #805]
-
The following bundled gems are added.
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.
-
tsort 0.2.0
-
win32-registry 0.1.2
The following bundled gems are removed.
-
net-ftp 0.3.9
-
net-pop 0.1.2
They are still available on rubygems.org and can be installed with gem install. [Feature #21835]
The following default gem is added.
The following default gems are updated.
-
RubyGems 4.1.0.dev
-
4.0.3 to v4.0.4, v4.0.5, v4.0.6, v4.0.7, v4.0.8, v4.0.9, v4.0.10, v4.0.11, v4.0.12, v4.0.13, v4.0.14, v4.0.15, v4.0.16, v4.0.17, v4.0.18
-
bundler 4.1.0.dev
-
4.0.3 to v4.0.4, v4.0.5, v4.0.6, v4.0.7, v4.0.8, v4.0.9, v4.0.10, v4.0.11, v4.0.12, v4.0.13, v4.0.14, v4.0.15, v4.0.16, v4.0.17
-
erb 6.0.7
-
6.0.1 to v6.0.1.1, v6.0.2, v6.0.3, v6.0.4, v6.0.5, v6.0.6, v6.0.7
-
error_highlight 0.7.2
-
ipaddr 1.2.9
-
1.2.8 to v1.2.9
-
json 2.21.2
-
2.18.0 to v2.18.1, v2.19.0, v2.19.1, v2.19.2, v2.19.3, v2.19.4, v2.19.5, v2.19.6, v2.19.7, v2.19.8, v2.19.9, v2.20.0, v2.21.0, v2.21.2
-
openssl 4.0.2
-
pp 0.6.4
-
0.6.3 to v0.6.4
-
prism 1.9.0
-
psych 5.4.0
-
5.3.1 to v5.4.0
-
resolv 0.7.1
-
0.7.0 to v0.7.1
-
stringio 3.2.1.dev
-
strscan 3.1.9.dev
-
syntax_suggest 3.0.0
-
timeout 0.6.1
-
0.6.0 to v0.6.1
-
zlib 3.2.3
-
3.2.2 to v3.2.3
The following bundled gems are updated.
-
minitest 6.0.6
-
rake 13.4.2
-
test-unit 3.7.8
-
rss 0.3.3
-
0.3.2 to 0.3.3
-
net-imap 0.6.6
-
rbs 4.0.3
-
3.10.0 to v3.10.1, v3.10.2, v3.10.3, v3.10.4, v4.0.0.dev.1, v4.0.0.dev.2, v4.0.0.dev.3, v4.0.0.dev.4, v4.0.0.dev.5, v4.0.0, v4.0.1.dev.1, v4.0.1.dev.2, v4.0.1, v4.0.2, v4.0.3
-
typeprof 0.32.0
-
mutex_m 0.3.0
-
bigdecimal 4.1.2
-
resolv-replace 0.2.0
-
0.1.1 to v0.2.0
-
nkf 0.3.0
-
0.2.0 to v0.3.0
-
syslog 0.4.0
-
0.3.0 to v0.4.0
-
csv 3.3.6
-
3.3.5 to v3.3.6
-
repl_type_completor 0.1.16
-
pstore 0.2.1
-
0.2.0 to v0.2.1
-
rdoc 8.0.0
-
win32ole 1.9.3
-
1.9.2 to v1.9.3
-
irb 1.18.0
RubyGems and Bundler
Ruby 4.0 bundled RubyGems and Bundler version 4. see the following links for details.
Supported platforms
-
Support code for the following platforms has been removed. Note that all of them reached end of life many years ago and Ruby has long been unbuildable on them.
-
Interix (Windows Services for UNIX)
-
SunOS 4 (Solaris, i.e. SunOS 5, is unaffected)
-
BSD/OS (BSDi)
-
Compatibility issues
-
Kernel#at_exitandEND {}now raiseRactor::IsolationErrorwhen called in a non-mainRactor. Previously the registered handler ran in the mainRactorat process exit, which was confusing. [Feature #22139] -
Ractor.make_shareablenow raisesRactor::Errorfor anIOobject, andRactor.shareable?returnsfalsefor it. A frozenIOused to be shareable, but almost all of its methods raiseFrozenErrorand it can still refer to unshareable objects through the members ofrb_io_t.
Stdlib compatibility issues
C API updates
Embedded TypedData
-
The
RUBY_TYPED_EMBEDDABLEflag is now public and documented and can be used by C extensions. It allows allocating C structs directly into Ruby object slots, which reduces pointer chasing, and in some case memory usage. See the C extension documentation for details. [Feature #21853] -
Added new C23 inspired allocator functions, that takes the previous memory size. This allow the Ruby
GCto better keep track of memory usage, improving its heuristics. It also improves the performance of system allocators that support C23free_sized.
However, it is important to note that passing an incorrect size to these function is undefined behavior and may result in crashes or memory leaks.
-
ruby_xfree_sized(void *ptr, size_t size) -
ruby_xrealloc_sized(void *ptr, size_t newsiz, size_t oldsiz) -
ruby_xrealloc2_sized(void *ptr, size_t newelems, size_t newsiz, size_t oldelems)
Removed APIs
The following APIs, which have been deprecated for many years, are removed. [Feature #21768]
-
old postponed job functions,
-
untyped data object type/functions,
-
old APIs to allocate a data object,
-
taintedness/trustedness enums/macros,
-
rb_gc_force_recyclefunction, -
rb_iteratefunction, -
and some functions and constants for internal use.
Implementation improvements
-
The default garbage collector has been switched from a freelist allocator to a bump pointer allocator. [PR #17201]
-
The error_highlight, did_you_mean, and syntax_suggest gems are now loaded lazily on the first error display instead of at interpreter boot, which reduces startup time.
Process.warmuploads them eagerly so that pre-forking servers keep their code in copy-on-write shared memory. [Feature #21951]
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.