6.7 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]] -
Pin operator now supports instance, class, and global variables. [Feature #17724]
@n = 5 Prime.each_cons(2).lazy.find{_1 in [n, ^@n]} #=> [3, 5] -
One-line pattern matching is no longer experimental.
-
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] = barThe following evaluation order is used:
foobar[]=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, bVersions of Ruby before 3.1.0 would evaluate in the following order
abfoo[]=called on the result offoobarbaz=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:
foobarab[]=called on the result offoobaz=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]
-
Integer
- Integer.try_convert is added. [Feature #15211]
-
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]
-
-
String
- Update Unicode version to 13.0.0 [Feature #17750] and Emoji version to 13.0 [Feature #18029]
-
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-limitcommand 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.getaddrinfousingaddress_resolvehook. [Feature #17370] -
Introduce non-blocking
Timeout.timeoutusingtimeout_afterhook. [Feature #17470] -
IO hooks
io_wait,io_read,io_write, receive the original IO object where possible. [Bug #18003] -
Make
Monitorfiber-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_writableandrb_wait_for_single_fdare deprecated in favour ofrb_io_maybe_wait_readable,rb_io_maybe_wait_writableandrb_io_maybe_waitrespectively.rb_thread_wait_fdandrb_thread_fd_writableare deprecated. [Bug #18003]
Stdlib compatibility issues
ERB#initializewarnssafe_leveland later arguments even without -w. [Feature #14256]
C API updates
Implementation improvements
JIT
-
The default
--jit-max-cacheis changed from 100 to 10000. -
JIT-ed code is no longer cancelled when a TracePoint for class events is enabled.
-
The JIT compiler no longer skips compilation of methods longer than 1000 instructions.
-
--jit-verboseand--jit-warningoutput "JIT cancel" when JIT-ed code is disabled because TracePoint or GC.compact is used. -
RubyVM::MJITis 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] -
Now exceptions raised in finalizers will be printed to
STDERR, unless$VERBOSEisnil. [Feature #17798]