Posted by naruse on 25 Dec 2024
We are pleased to announce the release of Ruby 3.4.0. Ruby 3.4 adds it
block parameter reference, changes Prism as default parser, adds Happy Eyeballs Version 2 support to socket library, improves YJIT, adds Modular GC, and so on.
it
is introduced
it
is added to reference a block parameter with no variable name. [Feature #18980]
ary = ["foo", "bar", "baz"]
p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]
it
very much behaves the same as _1
. When the intention is to only use _1
in a block, the potential for other numbered parameters such as _2
to also appear imposes an extra cognitive load onto readers. So it
was introduced as a handy alias. Use it
in simple cases where it
speaks for itself, such as in one-line blocks.
Switch the default parser from parse.y to Prism. [Feature #20564]
This is an internal improvement and there should be little change visible to the user. If you notice any compatibility issues, please report them to us.
To use the conventional parser, use the command-line argument --parser=parse.y
.
The socket library now features Happy Eyeballs Version 2 (RFC 8305), the latest standardized version of a widely adopted approach for better connectivity in many programming languages, in TCPSocket.new
(TCPSocket.open
) and Socket.tcp
. This improvement enables Ruby to provide efficient and reliable network connections, adapted to modern internet environments.
Until Ruby 3.3, these methods performed name resolution and connection attempts serially. With this algorithm, they now operate as follows:
This ensures minimized connection delays, even if a specific protocol or IP address is delayed or unavailable. This feature is enabled by default, so additional configuration is not required to use it. To disable it globally, set the environment variable RUBY_TCP_NO_FAST_FALLBACK=1
or call Socket.tcp_fast_fallback=false
. Or to disable it on a per-method basis, use the keyword argument fast_fallback: false
.
--yjit-mem-size
introduces a unified memory limit (default 128MiB) to track total YJIT memory usage, providing a more intuitive alternative to the old --yjit-exec-mem-size
option.--yjit-log
enables a compilation log to track what gets compiled.RubyVM::YJIT.log
provides access to the tail of the compilation log at run-time.RubyVM::YJIT.runtime_stats
now always provides additional statistics on invalidation, inlining, and metadata encoding.Array#each
, Array#select
, Array#map
rewritten in Ruby for better performance [Feature #20182].self
String#getbyte
, String#setbyte
and other string methodsAlternative garbage collector (GC) implementations can be loaded dynamically through the modular garbage collector feature. To enable this feature, configure Ruby with --with-modular-gc
at build time. GC libraries can be loaded at runtime using the environment variable RUBY_GC_LIBRARY
. [Feature #20351]
Ruby’s built-in garbage collector has been split into a separate file at gc/default/default.c
and interacts with Ruby using an API defined in gc/gc_impl.h
. The built-in garbage collector can now also be built as a library using make modular-gc MODULAR_GC=default
and enabled using the environment variable RUBY_GC_LIBRARY=default
. [Feature #20470]
An experimental GC library is provided based on MMTk. This GC library can be built using make modular-gc MODULAR_GC=mmtk
and enabled using the environment variable RUBY_GC_LIBRARY=mmtk
. This requires the Rust toolchain on the build machine. [Feature #20860]
String literals in files without a frozen_string_literal
comment now emit a deprecation warning when they are mutated. These warnings can be enabled with -W:deprecated
or by setting Warning[:deprecated] = true
. To disable this change, you can run Ruby with the --disable-frozen-string-literal
command line argument. [Feature #20205]
Keyword splatting nil
when calling methods is now supported. **nil
is treated similarly to **{}
, passing no keywords, and not calling any conversion methods. [Bug #20064]
Block passing is no longer allowed in index. [Bug #19918]
Keyword arguments are no longer allowed in index. [Bug #20218]
The toplevel name ::Ruby
is reserved now, and the definition will be warned when Warning[:deprecated]
. [Feature #20884]
Note: We’re only listing notable updates of Core class.
Exception
Exception#set_backtrace
now accepts an array of Thread::Backtrace::Location
. Kernel#raise
, Thread#raise
and Fiber#raise
also accept this new format. [Feature #13557]GC
GC.config
added to allow setting configuration variables on the Garbage Collector. [Feature #20443]
GC configuration parameter rgengc_allow_full_mark
introduced. When false
GC will only mark young objects. Default is true
. [Feature #20443]
Ractor
require
in Ractor is allowed. The requiring process will be run on the main Ractor. Ractor._require(feature)
is added to run requiring process on the main Ractor. [Feature #20627]
Ractor.main?
is added. [Feature #20627]
Ractor.[]
and Ractor.[]=
are added to access the ractor local storage of the current Ractor. [Feature #20715]
Ractor.store_if_absent(key){ init }
is added to initialize ractor local variables in thread-safty. [Feature #20875]
Range
Range#size
now raises TypeError
if the range is not iterable. [Misc #18984]Note: We’re only listing notable updates of Standard libraries.
--attestation
option to gem push. It enabled to store signature to sigstore.devlockfile_checksums
configuration to include checksums in fresh lockfiles--add-checksums
to add checksums to an existing lockfileJSON
JSON.parse
about 1.5 times faster than json-2.7.x.Tempfile
anonymous: true
is implemented for Tempfile.create. Tempfile.create(anonymous: true)
removes the created temporary file immediately. So applications don’t need to remove the file. [Feature #20497]win32/sspi.rb
Note: Excluding feature bug fixes.
Kernel#caller
, Thread::Backtrace::Location
’s methods, etc. are also changed accordingly.Old:
test.rb:1:in `foo': undefined method `time' for an instance of Integer
from test.rb:2:in `<main>'
New:
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
from test.rb:2:in '<main>'
Hash#inspect rendering have been changed. [Bug #20433]
"{user: 1}"
=>
: '{"user" => 1}'
, while previously they didn’t: '{"user"=>1}'
Kernel#Float() now accepts a decimal string with decimal part omitted. [Feature #20705]
Float("1.") #=> 1.0 (previously, an ArgumentError was raised)
Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
String#to_f now accepts a decimal string with decimal part omitted. Note that the result changes when an exponent is specified. [Feature #20705]
"1.".to_f #=> 1.0
"1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
DidYouMean
DidYouMean::SPELL_CHECKERS[]=
and DidYouMean::SPELL_CHECKERS.merge!
are removed.Net::HTTP
Net::HTTP::ProxyMod
Net::NetPrivate::HTTPRequest
Net::HTTPInformationCode
Net::HTTPSuccessCode
Net::HTTPRedirectionCode
Net::HTTPRetriableCode
Net::HTTPClientErrorCode
Net::HTTPFatalErrorCode
Net::HTTPServerErrorCode
Net::HTTPResponseReceiver
Net::HTTPResponceReceiver
These constants were deprecated from 2012.
Timeout
URI
rb_newobj
and rb_newobj_of
(and corresponding macros RB_NEWOBJ
, RB_NEWOBJ_OF
, NEWOBJ
, NEWOBJ_OF
) have been removed. [Feature #20265]rb_gc_force_recycle
. [Feature #18290]Passing a block to a method which doesn’t use the passed block will show a warning on verbose mode (-w
). [Feature #15554]
Redefining some core methods that are specially optimized by the interpreter and JIT like String.freeze
or Integer#+
now emits a performance class warning (-W:performance
or Warning[:performance] = true
). [Feature #20429]
See NEWS or commit logs for more details.
With those changes, 4942 files changed, 202244 insertions(+), 255528 deletions(-) since Ruby 3.3.0!
Merry Christmas, Happy Holidays, and enjoy programming with Ruby 3.4!
Downloadhttps://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz
SIZE: 23153022
SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335
SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379
SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz
SIZE: 17215572
SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68
SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca
SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip
SIZE: 28310193
SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5
SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555
SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
Ruby was first developed by Matz (Yukihiro Matsumoto) in 1993, and is now developed as Open Source. It runs on multiple platforms and is used all over the world especially for web development.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.3