5.5 KiB
NEWS for Ruby 3.1.0
This document is a list of user visible feature changes since the 3.0.0 release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
Language changes
-
Pin operator now takes an expression. [Feature #17411]
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a #=> [[3, 5], [5, 7], [11, 13]]
-
Multiple assignment evaluation order has been made consistent with single assignment evaluation order. With single assignment, Ruby uses a left-to-right evaluation order. With this code:
foo[0] = bar
The following evaluation order is used:
foo
bar
[]=
called on the result offoo
In Ruby before 3.1.0, multiple assignment did not follow this evaluation order. With this code:
foo[0], bar.baz = a, b
Versions of Ruby before 3.1.0 would evaluate in the following order
a
b
foo
[]=
called on the result offoo
bar
baz=
called on the result ofbar
Starting in Ruby 3.1.0, evaluation order is now consistent with single assignment, with the left hand side being evaluated before the right hand side:
foo
bar
a
b
[]=
called on the result offoo
baz=
called on the result ofbar
Command line options
Core classes updates
Outstanding ones only.
-
Array
- Array#intersect? is added. [Feature #15198]
-
Enumerable
-
Enumerable#compact is added. [Feature #17312]
-
Enumerable#tally now accepts an optional hash to count. [Feature #17744]
-
-
Enumerator::Lazy
- Enumerator::Lazy#compact is added. [Feature #17312]
-
File
- File.dirname now accepts an optional argument for the level to strip path components. [Feature #12194]
-
Module
- Module#prepend now modifies the ancestor chain if the receiver already includes the argument. Module#prepend still does not modify the ancestor chain if the receiver has already prepended the argument. [Bug #17423]
-
Struct
-
Passing only keyword arguments to Struct#initialize is warned. You need to use a Hash literal to set a Hash to a first member. [Feature #16806]
-
StructClass#keyword_init? is added Feature #18008
-
-
Queue
- Queue#initialize now accepts an Enumerable of initial values. [Feature #17327]
-
Thread
- Thread#native_thread_id is added. [Feature #17853]
-
Thread::Backtrace
- Thread::Backtrace.limit, which returns the value to limit backtrace
length set by
--backtrace-limit
command line option, is added. [Feature #17479]
- Thread::Backtrace.limit, which returns the value to limit backtrace
length set by
-
$LOAD_PATH
- $LOAD_PATH.resolve_feature_path does not raise. [Feature #16043]
-
Fiber Scheduler
-
Add support for
Addrinfo.getaddrinfo
usingaddress_resolve
hook. [Feature #17370] -
Introduce non-blocking
Timeout.timeout
usingtimeout_after
hook. [Feature #17470] -
IO hooks
io_wait
,io_read
,io_write
, receive the original IO object where possible. [Bug #18003] -
Make
Monitor
fiber-safe. [Bug #17827] -
Replace copy coroutine with pthread implementation. [Feature #18015]
-
Stdlib updates
Outstanding ones only.
Compatibility issues
Excluding feature bug fixes.
rb_io_wait_readable
,rb_io_wait_writable
andrb_wait_for_single_fd
are deprecated in favour ofrb_io_maybe_wait_readable
,rb_io_maybe_wait_writable
andrb_io_maybe_wait
respectively.rb_thread_wait_fd
andrb_thread_fd_writable
are deprecated. [Bug #18003]
Stdlib compatibility issues
ERB#initialize
warnssafe_level
and later arguments even without -w. [Feature #14256]
C API updates
Implementation improvements
JIT
-
The default
--jit-max-cache
is changed from 100 to 10000. -
The JIT compiler no longer skips compilation of methods longer than 1000 instructions.
-
RubyVM::MJIT
is renamed toRubyVM::JIT
. [Feature #17490]
Static analysis
RBS
TypeProf
Miscellaneous changes
- lib/objspace/trace.rb is added, which is a tool for tracing the object
allocation. Just by requiring this file, tracing is started immediately.
Just by
Kernel#p
, you can investigate where an object was created. Note that just requiring this file brings a large performance overhead. This is only for debugging purpose. Do not use this in production. Feature #17762