-
-
Notifications
You must be signed in to change notification settings - Fork 942
Description
See https://github.com/ruby/ruby/blob/v3_1_0/NEWS.md for the full 3.1 NEWS file.
This listing includes all features from the Ruby 3.1 news file that might be relevant to JRuby. I have removed sections specific to the Ruby C API or the static analysis and type-profiling libraries that are not currently supported on JRuby.
See also #6878 for Ruby 3.0 features and #6464 for Ruby 2.7, which will also be included.
Language changes
-
The block argument can now be anonymous if the block will
only be passed to another method. [Feature #11256] (Support anonymous block passthrough (3.1) #7044)def foo(&) bar(&) end
-
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.
-
Parentheses can be omitted in one-line pattern matching.
[Feature #16182][0, 1] => _, x {y: 2} => y: x #=> 1 y #=> 2
-
Multiple assignment evaluation order consistency #7440 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:
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, b
Versions of Ruby before 3.1.0 would evaluate in the following
orderabfoo[]=called on the result offoobarbaz=called on the result ofbar
Starting in Ruby 3.1.0, the 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
-
Values in Hash literals and keyword arguments can be omitted.
[Feature #14579]For example,
{x:, y:}is a syntax sugar of{x: x, y: y}.foo(x:, y:)is a syntax sugar offoo(x: x, y: y).
Constant names, local variable names, and method names are allowed as
key names. Note that a reserved word is considered as a local
variable or method name even if it's a pseudo variable name such as
self. -
Non main-Ractors can get instance variables (ivars) of classes/modules
if ivars refer to shareable objects.
[Feature #17592] -
A command syntax is allowed in endless method definitions, i.e.,
you can now writedef foo = puts "Hello".
Note thatprivate def foo = puts "Hello"does not parse.
[Feature #17398]
Command line options
-
--disable-gemsis now explicitly declared as "just for debugging".
Never use it in any real-world codebase.
[Feature #17684]
Core classes updates
Note: We're only listing outstanding class updates.
-
Array
- Array#intersect? is added. [Feature #15198]
-
Class
-
Class#subclasses, which returns an array of classes
directly inheriting from the receiver, not
including singleton classes.
[Feature #18273]class A; end class B < A; end class C < B; end class D < A; end A.subclasses #=> [D, B] B.subclasses #=> [C] C.subclasses #=> []
-
-
Enumerable
-
Enumerable#compact is added. [Feature #17312]
-
Enumerable#tally now accepts an optional hash to count. [Feature #17744]
-
Enumerable#each_cons and each_slice to return a receiver. [GH-1509]
[1, 2, 3].each_cons(2){} # 3.0 => nil # 3.1 => [1, 2, 3] [1, 2, 3].each_slice(2){} # 3.0 => nil # 3.1 => [1, 2, 3]
-
-
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]
- File.dirname now accepts an optional argument for the level to
-
GC
-
"GC.measure_total_time = true" enables the measurement of GC.
Measurement can introduce overhead. It is enabled by default.
GC.measure_total_time returns the current setting.
GC.stat[:time] or GC.stat(:time) returns measured time
in milli-seconds. [[Feature #10917]] -
GC.total_time returns measured time in nano-seconds. [[Feature #10917]]
-
-
Integer
- Integer.try_convert is added. [Feature #15211]
-
Kernel
- Kernel#load now accepts a module as the second argument,and will load the file using the given module as thetop-level module. [Feature #6210] #7439
and will load the file using the given module as the
top-level module. [Feature #6210]
- Kernel#load now accepts a module as the second argument,and will load the file using the given module as thetop-level module. [Feature #6210] #7439
-
Marshal
- Marshal.load now accepts a
freeze: trueoption.
All returned objects are frozen except forClassand
Moduleinstances. Strings are deduplicated. [Feature #18148]
- Marshal.load now accepts a
-
MatchData
-
MatchData#match is added [Feature #18172]
-
MatchData#match_length is added [Feature #18172]
-
-
Method / UnboundMethod
- Method#public?, Method#private?, Method#protected?,
UnboundMethod#public?, UnboundMethod#private?,
UnboundMethod#protected? have been added. [Feature #11689]
- Method#public?, Method#private?, Method#protected?,
-
Module
-
Module#prepend now modifies the ancestor chain if the receiver already includes the argument #7382
Module#prepend still does not modify the ancestor chain if the receiver has already prepended
the argument. [Bug #17423] -
Module#private, #public, #protected, and #module_function will
now return their arguments. If a single argument is given, it
is returned. If no arguments are given, nil is returned. If
multiple arguments are given, they are returned as an array.
[Feature #12495]
-
-
Process
- Process._fork is added. This is a core method for fork(2).
Do not call this method directly; it is called by existing
fork methods: Kernel.#fork, Process.fork, and IO.popen("-").
Application monitoring libraries can overwrite this method to
hook fork events. [Feature #17795]
- Process._fork is added. This is a core method for fork(2).
-
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] -
String#unpack and String#unpack1 now accept an
offset:keyword
argument to start the unpacking after an arbitrary number of bytes
have been skipped. Ifoffsetis outside of the string bounds
ArgumentErroris raised. [Feature #18254]
-
-
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
-
Thread::Queue
- Thread::Queue.new now accepts an Enumerable of initial values.
[Feature #17327]
- Thread::Queue.new now accepts an Enumerable of initial values.
-
Time
-
Time.new now accepts optional
in:keyword argument for the
timezone, as well asTime.atandTime.now, so that is now
you can omit minor arguments toTime.new. [Feature #17485]Time.new(2021, 12, 25, in: "+07:00") #=> 2021-12-25 00:00:00 +0700
At the same time, time component strings are converted to
integers more strictly now.Time.new(2021, 12, 25, "+07:30") #=> invalid value for Integer(): "+07:30" (ArgumentError)
Ruby 3.0 or earlier returned probably unexpected result
2021-12-25 07:00:00, not2021-12-25 07:30:00nor
2021-12-25 00:00:00 +07:30. -
Time#strftime supports RFC 3339 UTC for unknown offset local
time,-0000, as%-z. [Feature #17544]
-
-
TracePoint
- TracePoint.allow_reentry is added to allow reenter while TracePoint
callback.
[Feature #15912]
- TracePoint.allow_reentry is added to allow reenter while TracePoint
-
$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] -
Introduce new scheduler hooks
io_readandio_writealong with a
low levelIO::Bufferfor zero-copy read/write. [Feature #18020] -
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]
-
-
Refinement
- New class which represents a module created by Module#refine.
includeandprependare deprecated, andimport_methodsis added
instead. [Bug #17429]
- New class which represents a module created by Module#refine.
Stdlib updates
-
The following default gem are updated.
- RubyGems 3.3.3
- base64 0.1.1
- benchmark 0.2.0
- bigdecimal 3.1.1 (Allow installation on JRuby ruby/bigdecimal#169)
- bundler 2.3.3
- cgi 0.3.1 (jruby support ruby/cgi#9, waiting for a release)
- csv 3.2.2
- date 3.2.2 (JRuby support ruby/date#48)
- did_you_mean 1.6.1
- digest 3.1.0
- drb 2.1.0
- erb 2.2.3
- error_highlight 0.3.0
- etc 1.3.0 (JRuby support ruby/etc#19)
- fcntl 1.0.1 (JRuby support ruby/fcntl#9)
- fiddle 1.1.0 (JRuby support ruby/fiddle#104)
- fileutils 1.6.0
- find 0.1.1
- io-console 0.5.10
- io-wait 0.2.1 (JRuby support ruby/io-wait#2)
- ipaddr 1.2.3
- irb 1.4.1
- json 2.6.1
- logger 1.5.0
- net-http 0.2.0 (Depends on io-wait via net-protocol)
- net-protocol 0.1.2 (Depends on io-wait)
- nkf 0.1.1 (Partial implementation in JRuby, unsure whether this is important)
- open-uri 0.2.0 (Depends on stringio)
- openssl 3.0.0 (jruby-openssl migration ruby/openssl#20 (comment))
- optparse 0.2.0
- ostruct 0.5.2
- pathname 0.2.0 (JRuby support ruby/pathname#17)
- pp 0.3.0
- prettyprint 0.1.1
- psych 4.0.3
- racc 1.6.0
- rdoc 6.4.0
- readline 0.0.3 (JRuby support ruby/readline#5)
- readline-ext 0.1.4 (will be solved along with readline)
- reline 0.3.0
- resolv 0.2.1 (JRuby support ruby/resolv#19)
- rinda 0.1.1
- ruby2_keywords 0.0.5
- securerandom 0.1.1 (JRuby support ruby/securerandom#9)
- set 1.0.2 (JRuby support ruby/set#21)
- stringio 3.0.1 (Import JRuby's stringio impl ruby/stringio#21)
- strscan 3.0.1 (Import JRuby's strscan ruby/strscan#25)
- tempfile 0.1.2 (JRuby support ruby/tempfile#7)
- time 0.2.0 (Depends on date)
- timeout 0.2.0 (JRuby support ruby/timeout#11)
- tmpdir 0.1.2 (JRuby support ruby/tmpdir#13)
- un 0.2.0
- uri 0.11.0
- yaml 0.2.0 (For better JRuby error when psych fails to load: JRuby support ruby/weakref#6)
- zlib 2.1.1 (JRuby support ruby/zlib#38)
-
The following bundled gems are updated.
- minitest 5.15.0
- power_assert 2.0.1
- rake 13.0.6
- test-unit 3.5.3
- rexml 3.2.5
- rbs 2.0.0 (Depends on many internals of CRuby)
- typeprof 0.21.1 (Depends on many internals of CRuby)
-
The following default gems are now bundled gems.
- net-ftp 0.1.3 (Depends on io-wait via net-protocol)
- net-imap 0.2.2 (Depends on io-wait via net-protocol)
- net-pop 0.1.1 (Depends on io-wait via net-protocol)
- net-smtp 0.3.1 (Depends on io-wait via net-protocol)
- matrix 0.4.2
- prime 0.1.2
- debug 1.4.0 (Depends on many internals of CRuby in newer versions)
-
The following non-updated gems are not yet installable on JRuby.
- gdbm 2.1.0
- io-nonblock (JRuby support ruby/io-nonblock#4)
- syslog 0.1.0 (JRuby support ruby/syslog#1)
- win32ole 1.8.8 (JRuby support ruby/win32ole#12)
-
The following non-updated gems are now using the gem in JRuby
- weakref 0.1.1
-
Coverage measurement now supports suspension. You can use
Coverage.suspend
to stop the measurement temporarily, andCoverage.resumeto restart it.
See [Feature #18176] in detail. -
Random::Formatter is moved to random/formatter.rb, so that you can
useRandom#hex,Random#base64, and so on without SecureRandom.
[Feature #18190]
Stdlib compatibility issues
-
ERB#initializewarnssafe_leveland later arguments even without -w.
[Feature #14256] -
lib/debug.rbis replaced withdebug.gem -
Kernel#ppinlib/pp.rbuses the width ofIO#winsizeby default.
This means that the output width is automatically changed depending on
your terminal size. [Feature #12913] -
Psych 4.0 changes
Psych.loadassafe_loadby the default.
You may need to use Psych 3.3.2 for migrating to this behavior.
[Bug #17866]
Implementation improvements
These do not apply directly to JRuby, but we should check if we have equivalent optimizations in place.
-
Inline cache mechanism is introduced for reading class variables.
[Feature #17763] -
instance_evalandinstance_execnow only allocate a singleton class when
required, avoiding extra objects and improving performance. [GH-5146] -
The performance of
Structaccessors is improved. [GH-5131] -
mandatory_only?builtin special form to improve performance on
builtin methods. [GH-5112] -
Experimental feature Variable Width Allocation in the garbage collector.
This feature is turned off by default and can be enabled by compiling Ruby
with flagUSE_RVARGC=1set. [Feature #18045] [Feature #18239]
Debugger
-
A new debugger debug.gem is bundled.
debug.gem is a fast debugger implementation, and it provides many features
like remote debugging, colorful REPL, IDE (VSCode) integration, and more.
It replaceslib/debug.rbstandard library. -
rdbgcommand is also installed intobin/directory to start and control
debugging execution.
error_highlight
- A built-in gem called error_highlight has been introduced.
It shows fine-grained error locations in the backtrace.
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 byKernel#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 purposes. Do not use this in production.
[Feature #17762] -
Now exceptions raised in finalizers will be printed to
STDERR, unless
$VERBOSEisnil. [Feature #17798] -
ruby -run -e httpddisplays URLs to access. [Feature #17847] -
Add
ruby -run -e colorizeto colorize Ruby code using
IRB::Color.colorize_code.