This document is a list of user-visible feature changes since the 3.1.0 release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
Anonymous rest and keyword rest arguments can now be passed as arguments, instead of just used in method parameters. [Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end
A proc that accepts a single positional argument and keywords will no longer autosplat. [Bug #18633]
ruby proc{|a, **k| a}.call([1, 2]) # Ruby 3.1 and before # => 1 # Ruby 3.2 and after # => [1, 2]
Constant assignment evaluation order for constants set on explicit objects has been made consistent with single attribute assignment evaluation order. With this code:
foo::BAR = baz
foo
is now called before baz
. Similarly, for multiple assignments to constants, left-to-right evaluation order is used. With this code:
```ruby foo1::BAR1, foo2::BAR2 = baz1, baz2 ```
The following evaluation order is now used:
foo1
foo2
baz1
baz2
Find pattern is no longer experimental. [Feature #18585]
Methods taking a rest parameter (like *args
) and wishing to delegate keyword arguments through foo(*args)
must now be marked with ruby2_keywords
(if not already the case). In other words, all methods wishing to delegate keyword arguments through *args
must now be marked with ruby2_keywords
, with no exception. This will make it easier to transition to other ways of delegation once a library can require Ruby 3+. Previously, the ruby2_keywords
flag was kept if the receiving method took *args
, but this was a bug and an inconsistency. A good technique to find the potentially-missing ruby2_keywords
is to run the test suite, for where it fails find the last method which must receive keyword arguments, use puts nil, caller, nil
there, and check each method/block on the call chain which must delegate keywords is correctly marked as ruby2_keywords
. [Bug #18625] [Bug #16466]
def target(**kw) end # Accidentally worked without ruby2_keywords in Ruby 2.7-3.1, ruby2_keywords # needed in 3.2+. Just like (*args, **kwargs) or (...) would be needed on # both #foo and #bar when migrating away from ruby2_keywords. ruby2_keywords def bar(*args) target(*args) end ruby2_keywords def foo(*args) bar(*args) end foo(k: 1)
Note: We're only listing outstanding class updates.
Enumerator.product
has been added. Enumerator::Product
is the implementation. [Feature #18685]
Enumerator.product
has been added. Enumerator::Product
is the implementation. [Feature #18685]
Hash#shift
now always returns nil if the hash is empty, instead of returning the default value or calling the default proc. [Bug #16908]
Integer#ceildiv
has been added. [Feature #18809]
Kernel#binding
raises RuntimeError
if called from a non-Ruby frame (such as a method defined in C). [Bug #18487]
MatchData#byteoffset
has been added. [Feature #13110]
Module.used_refinements
has been added. [Feature #14332]
Module#refinements
has been added. [Feature #12737]
Module#const_added
has been added. [Feature #17881]
Module#undefined_instance_methods
has been added. [Feature #12655]
Proc#dup
returns an instance of subclass. [Bug #17545]
Proc#parameters
now accepts lambda keyword. [Feature #15357]
Regexp.new
now supports passing the regexp flags not only as an Integer
, but also as a String
Unknown flags raise errors. Otherwise, anything other than true
, false
, nil
or Integer
will be warned. [Feature #18788]
Refinement#refined_class has been added. [Feature #12737]
Set
Set is now available as a built-in class without the need for require "set"
. [Feature #16989] It is currently autoloaded via the Set
constant or a call to Enumerable#to_set
.
String#byteindex
and String#byterindex
have been added. [Feature #13110]
Update Unicode to Version 14.0.0 and Emoji Version 14.0. [Feature #18037] (also applies to Regexp
)
String#bytesplice
has been added. [Feature #18598]
A Struct
class can also be initialized with keyword arguments without keyword_init: true
on Struct.new
[Feature #16806]
TracePoint#binding
now returns nil
for c_call
/c_return
TracePoints. [Bug #18487]
TracePoint#enable
target_thread
keyword argument now defaults to the current thread if target
and target_line
keyword arguments are not passed. [Bug #16889]
SyntaxSuggest
The feature of syntax_suggest
formerly dead_end
is integrated in Ruby. [Feature #18159]
The following default gems are updated.
RubyGems 3.4.0.dev
bigdecimal 3.1.2
bundler 2.4.0.dev
cgi 0.3.2
date 3.2.3
error_highlight 0.4.0
etc 1.4.0
io-console 0.5.11
io-nonblock 0.1.1
io-wait 0.3.0.pre
ipaddr 1.2.4
json 2.6.2
logger 1.5.1
net-http 0.2.2
net-protocol 0.1.3
ostruct 0.5.5
psych 5.0.0.dev
reline 0.3.1
securerandom 0.2.0
set 1.0.3
stringio 3.0.3
syntax_suggest 0.0.1
timeout 0.3.0
The following bundled gems are updated.
minitest 5.16.3
net-imap 0.2.3
rbs 2.6.0
typeprof 0.21.3
debug 1.6.2
The following default gems are now bundled gems.
Note: Excluding feature bug fixes.
The following deprecated constants are removed.
Fixnum
and Bignum
[Feature #12005]
Random::DEFAULT
[Feature #17351]
Struct::Group
Struct::Passwd
The following deprecated methods are removed.
Dir.exists?
[Feature #17391]
File.exists?
[Feature #17391]
Kernel#=~
[Feature #15231]
Kernel#taint
, Kernel#untaint
, Kernel#tainted?
[Feature #16131]
Kernel#trust
, Kernel#untrust
, Kernel#untrusted?
[Feature #16131]
Psych
no longer bundles libyaml sources. Users need to install the libyaml library themselves via the package system. [Feature #18571]
The following deprecated APIs are removed.
rb_cData
variable.
“taintedness” and “trustedness” functions. [Feature #16131]
Fixed several race conditions in Kernel#autoload
. [Bug #18782]
Support arm64 / aarch64 on UNIX platforms.
Building YJIT requires Rust 1.58.1+. [Feature #18481]