You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
Language changes
Anonymous rest and keyword rest arguments can now be passed as
arguments, instead of just used in method parameters.
[Feature #18351]
deffoo(*)bar(*)enddefbaz(**)quux(**)end
A proc that accepts a single positional argument and keywords will
no longer autosplat. [Bug #18633]
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:
"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]
deftarget(**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_keywordsdefbar(*args)target(*args)endruby2_keywordsdeffoo(*args)bar(*args)endfoo(k: 1)
eval and related methods are able to generate code coverage. Enabled using Coverage.setup(:all) or Coverge.setup(eval: true). [Feature #19008]
Coverage.supported?(mode) enables detection of what coverage modes are
supported. [Feature #19026]
Command line options
Core classes updates
Note: We're only listing outstanding class updates.
Fiber
Introduce Fiber.[] and Fiber.[]= for inheritable fiber storage.
Introduce Fiber#storage and Fiber#storage= (experimental) for
getting and resetting the current storage. Introduce Fiber.new(storage:) for setting the storage when creating a
fiber. [Feature #19078]
Existing Thread and Fiber local variables can be tricky to use.
Thread local variables are shared between all fibers, making it
hard to isolate, while Fiber local variables can be hard to
share. It is often desirable to define unit of execution
("execution context") such that some state is shared between all
fibers and threads created in that context. This is what Fiber
storage provides.
deflog(message)puts"#{Fiber[:request_id]}: #{message}"enddefhandle_requestswhilerequest=read_requestFiber.scheduledoFiber[:request_id]=SecureRandom.uuidrequest.messages.eachdo |message|
Fiber.scheduledolog("Handling #{message}")# Log includes inherited request_id.endendendendend
You should generally consider Fiber storage for any state which
you want to be shared implicitly between all fibers and threads
created in a given context, e.g. a connection pool, a request
id, a logger level, environment variables, configuration, etc.
Fiber::Scheduler
Introduce Fiber::Scheduler#io_select for non-blocking IO.select.
[Feature #19060]
Add support for UNIXSocket on Windows. Emulate anonymous sockets. Add
support for File.socket? and File::Stat#socket? where possible.
[Feature #19135]
Class
Class#attached_object, which returns the object for which
the receiver is the singleton class. Raises TypeError if the
receiver is not a singleton class.
[Feature #12084]
classFoo;endFoo.singleton_class.attached_object#=> FooFoo.new.singleton_class.attached_object#=> #<Foo:0x000000010491a370>Foo.attached_object#=> TypeError: `Foo' is not a singleton classnil.singleton_class.attached_object#=> TypeError: `NilClass' is not a singleton class
Data
New core class to represent simple immutable value object. The class is
similar to Struct and partially shares an implementation, but has more
lean and strict API. [Feature #16122]
Encoding
Encoding#replicate has been deprecated and will be removed in 3.3. [Feature #18949]
The dummy Encoding::UTF_16 and Encoding::UTF_32 encodings no longer
try to dynamically guess the endian based on a byte order mark.
Use Encoding::UTF_16BE/UTF_16LE and Encoding::UTF_32BE/UTF_32LE instead.
This change speeds up getting the encoding of a String. [Feature #18949]
Enumerator
Enumerator.product has been added. Enumerator::Product is the implementation. [Feature #18685]
Exception
Exception#detailed_message has been added.
The default error printer calls this method on the Exception object
instead of #message. [Feature #18564]
Hash
Hash#shift now always returns nil if the hash is
empty, instead of returning the default value or
calling the default proc. [Bug #16908]
Module#undefined_instance_methods has been added. [Feature #12655]
Proc
Proc#dup returns an instance of subclass. [Bug #17545]
Proc#parameters now accepts lambda keyword. [Feature #15357]
Process
Added RLIMIT_NPTS constant to FreeBSD platform
Regexp
Regexp.new now supports passing the regexp flags not only as an Integer,
but also as a String. Unknown flags raise ArgumentError.
Otherwise, anything other than true, false, nil or Integer will be warned.
[Feature #18788]
Regexp.timeout= has been added. Also, Regexp.new new supports timeout keyword.
See [Feature #17837]
Refinement
Refinement#refined_class has been added. [Feature #12737]
RubyVM::AbstractSyntaxTree
Add error_tolerant option for parse, parse_file and of. [Feature #19013]
With this option
SyntaxError is suppressed
AST is returned for invalid input
end is complemented when a parser reachs to the end of input but end is insufficient
end is treated as keyword based on indent
# Without error_tolerant optionroot=RubyVM::AbstractSyntaxTree.parse(<<~RUBY)def m a = 10 ifendRUBY# => <internal:ast>:33:in `parse': syntax error, unexpected `end' (SyntaxError)# With error_tolerant optionroot=RubyVM::AbstractSyntaxTree.parse(<<~RUBY,error_tolerant: true)def m a = 10 ifendRUBYproot# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-4:3># `end` is treated as keyword based on indentroot=RubyVM::AbstractSyntaxTree.parse(<<~RUBY,error_tolerant: true)module Z class Foo foo. end def bar endendRUBYproot.children[-1].children[-1].children[-1].children[-2..-1]# => [#<RubyVM::AbstractSyntaxTree::Node:CLASS@2:2-4:5>, #<RubyVM::AbstractSyntaxTree::Node:DEFN@6:2-7:5>]
Add keep_tokens option for parse, parse_file and of. Add #tokens and #all_tokens
for RubyVM::AbstractSyntaxTree::Node [Feature #19070]
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.
Socket
Added the following constants for supported platforms.
SO_INCOMING_CPU
SO_INCOMING_NAPI_ID
SO_RTABLE
SO_SETFIB
SO_USER_COOKIE
TCP_KEEPALIVE
TCP_CONNECTION_INFO
String
String#byteindex and String#byterindex have been added. [Feature #13110]
Update Unicode to Version 15.0.0 and Emoji Version 15.0. [Feature #18639]
(also applies to Regexp)
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]
Stdlib updates
Note: Most of these updates are superseded by those in #8029.
ERB
-S option is removed from erb command.
FileUtils
Add FileUtils.ln_sr method and relative: option to FileUtils.ln_s.
[Feature #18925]
SyntaxSuggest
The feature of syntax_suggest formerly dead_end is integrated in Ruby.
[Feature #18159]
NEWS for Ruby 3.2.0
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.
Language changes
Anonymous rest and keyword rest arguments can now be passed as
arguments, instead of just used in method parameters.
[Feature #18351]
A proc that accepts a single positional argument and keywords will
no longer autosplat. [Bug #18633]
Constant assignment evaluation order for constants set on explicit
objects has been made consistent with single attribute assignment
evaluation order. With this code:
foois now called beforebaz. Similarly, for multiple assignmentsto constants, left-to-right evaluation order is used. With this
code:
The following evaluation order is now used:
foo1foo2baz1baz2[Bug #15928]
"Find pattern" is no longer experimental.
[Feature #18585]
Methods taking a rest parameter (like
*args) and wishing to delegate keywordarguments through
foo(*args)must now be marked withruby2_keywords(if not already the case). In other words, all methods wishing to delegate
keyword arguments through
*argsmust now be marked withruby2_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_keywordsflag was kept if the receiving method took
*args, but this was a bug and aninconsistency. A good technique to find the potentially-missing
ruby2_keywordsis to run the test suite, for where it fails find the last method which must
receive keyword arguments, use
puts nil, caller, nilthere, and check eachmethod/block on the call chain which must delegate keywords is correctly marked
as
ruby2_keywords. [Bug #18625] [Bug #16466]evaland related methods are able to generate code coverage. Enabled usingCoverage.setup(:all)orCoverge.setup(eval: true). [Feature #19008]Coverage.supported?(mode)enables detection of what coverage modes aresupported. [Feature #19026]
Command line options
Core classes updates
Note: We're only listing outstanding class updates.
Fiber
Introduce Fiber.[] and Fiber.[]= for inheritable fiber storage.
Introduce Fiber#storage and Fiber#storage= (experimental) for
getting and resetting the current storage. Introduce
Fiber.new(storage:)for setting the storage when creating afiber. [Feature #19078]
Existing Thread and Fiber local variables can be tricky to use.
Thread local variables are shared between all fibers, making it
hard to isolate, while Fiber local variables can be hard to
share. It is often desirable to define unit of execution
("execution context") such that some state is shared between all
fibers and threads created in that context. This is what Fiber
storage provides.
You should generally consider Fiber storage for any state which
you want to be shared implicitly between all fibers and threads
created in a given context, e.g. a connection pool, a request
id, a logger level, environment variables, configuration, etc.
Fiber::Scheduler
Fiber::Scheduler#io_selectfor non-blocking IO.select.[Feature #19060]
IO
Introduce IO#timeout= and IO#timeout which can cause
IO::TimeoutError to be raised if a blocking operation exceeds the
specified timeout. [Feature #18630] Start implementing IO#timeout #8662
UNIXSocket
support for File.socket? and File::Stat#socket? where possible.
[Feature #19135]
Class
Class#attached_object, which returns the object for which
the receiver is the singleton class. Raises TypeError if the
receiver is not a singleton class.
[Feature #12084]
Data
similar to Struct and partially shares an implementation, but has more
lean and strict API. [Feature #16122]
Encoding
Encoding::UTF_16andEncoding::UTF_32encodings no longertry to dynamically guess the endian based on a byte order mark.
Use
Encoding::UTF_16BE/UTF_16LEandEncoding::UTF_32BE/UTF_32LEinstead.This change speeds up getting the encoding of a String. [Feature #18949]
Enumerator
Exception
The default error printer calls this method on the Exception object
instead of #message. [Feature #18564]
Hash
empty, instead of returning the default value or
calling the default proc. [Bug #16908]
Integer
Kernel
(such as a method defined in C). [Bug #18487]
MatchData
Module
Proc
Process
RLIMIT_NPTSconstant to FreeBSD platformRegexp
Regexp.new now supports passing the regexp flags not only as an Integer,
but also as a String. Unknown flags raise ArgumentError.
Otherwise, anything other than
true,false,nilor Integer will be warned.[Feature #18788]
Regexp.timeout= has been added. Also, Regexp.new new supports timeout keyword.
See [Feature #17837]
Refinement
RubyVM::AbstractSyntaxTree
Add
error_tolerantoption forparse,parse_fileandof. [Feature #19013]With this option
endis complemented when a parser reachs to the end of input butendis insufficientendis treated as keyword based on indentAdd
keep_tokensoption forparse,parse_fileandof. Add#tokensand#all_tokensfor RubyVM::AbstractSyntaxTree::Node [Feature #19070]
Set
require "set". [Feature #16989]It is currently autoloaded via the Set constant or a call to Enumerable#to_set.
Socket
SO_INCOMING_CPUSO_INCOMING_NAPI_IDSO_RTABLESO_SETFIBSO_USER_COOKIETCP_KEEPALIVETCP_CONNECTION_INFOString
(also applies to Regexp)
Struct
without
keyword_init: trueon Struct.new [Feature #16806]Time
in pattern-matching expressions [Feature #19071]
SyntaxError
TracePoint
nilforc_call/c_returnTracePoints.[Bug #18487]
target_threadkeyword argument now defaults to thecurrent thread if
targetandtarget_linekeyword arguments are notpassed. [Bug #16889]
Stdlib updates
Note: Most of these updates are superseded by those in #8029.
ERB
-Soption is removed fromerbcommand.FileUtils
relative:option to FileUtils.ln_s.[Feature #18925]
SyntaxSuggest
syntax_suggestformerlydead_endis integrated in Ruby.[Feature #18159]
The following default gems are updated.
The following bundled gems are updated.
Compatibility issues
Note: Excluding feature bug fixes.
Removed constants
The following deprecated constants are removed.
FixnumandBignum[Feature #12005]Random::DEFAULT[Feature #17351]Struct::GroupStruct::PasswdRemoved methods
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]