NEWS – Documentation for Ruby 3.4
This document is a list of user-visible feature changes since the 3.3.0 release, except for bug fixes.
Note that each entry is kept to a minimum, see links for details.
Language changes¶ ↑
-
itis added to reference a block parameter. [Feature #18980] -
Stringliterals in files without afrozen_string_literalcomment now emit a deprecation warning when they are mutated. These warnings can be enabled with-W:deprecatedor by settingWarning[:deprecated] = true. To disable this change, you can run Ruby with the--disable-frozen-string-literalcommand line argument. [Feature #20205]-
String#+@now duplicates when mutating the string would emit a deprecation warning, offered as a replacement for thestr.dup if str.frozen?pattern.
-
-
Keyword splatting
nilwhen calling methods is now supported.**nilis treated similarly to**{}, passing no keywords, and not calling any conversion methods. [Bug #20064] -
Block passing is no longer allowed in index assignment (e.g.
a[0, &b] = 1). [Bug #19918] -
Keyword arguments are no longer allowed in index assignment (e.g.
a[0, kw: 1] = 2). [Bug #20218] -
The toplevel name
::Rubyis reserved now, and the definition will be warned whenWarning[:deprecated]. [Feature #20884]
Core classes updates¶ ↑
Note: We’re only listing outstanding class updates.
Stdlib updates¶ ↑
We only list stdlib changes that are notable feature changes.
-
RubyGems
-
Add
--attestationoption to gem push. It enabled to store signature of build artifact to sigstore.dev. -
Add
--attestationoption to gem push. It enabled to store signature of build artifact to sigstore.dev.
-
-
win32/sspi.rb
Other changes are listed in the following sections. we also listed release history from the previous bundled version that is Ruby 3.3.0 if it has GitHub releases.
The following default gem is added.
The following default gems are updated.
-
RubyGems 3.6.2
-
benchmark 0.4.0
-
bundler 2.6.1
-
date 3.4.1
-
delegate 0.4.0
-
did_you_mean 2.0.0
-
digest 3.2.0
-
erb 4.0.4
-
error_highlight 0.7.0
-
etc 1.4.5
-
fcntl 1.2.0
-
fiddle 1.1.6
-
fileutils 1.7.3
-
io-console 0.8.0
-
io-nonblock 0.3.1
-
ipaddr 1.2.7
-
irb 1.14.3
-
json 2.9.1
-
logger 1.6.4
-
net-http 0.6.0
-
open-uri 0.5.0
-
optparse 0.6.0
-
ostruct 0.6.1
-
pathname 0.4.0
-
pp 0.6.2
-
prism 1.2.0
-
pstore 0.1.4
-
psych 5.2.2
-
rdoc 6.10.0
-
reline 0.6.0
-
resolv 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
shellwords 0.2.2
-
singleton 0.3.0
-
stringio 3.1.2
-
strscan 3.1.2
-
syntax_suggest 2.0.2
-
tempfile 0.3.1
-
time 0.4.1
-
timeout 0.4.3
-
tmpdir 0.3.1
-
uri 1.0.2
-
win32ole 1.9.1
-
yaml 0.4.0
-
zlib 3.2.1
The following bundled gem is added.
The following bundled gems are updated.
-
minitest 5.25.4
-
power_assert 2.0.5
-
rake 13.2.1
-
test-unit 3.6.7
-
rexml 3.4.0
-
rss 0.3.1
-
net-ftp 0.3.8
-
net-imap 0.5.4
-
net-smtp 0.5.0
-
prime 0.1.3
-
rbs 3.8.0
-
3.4.0 to v3.4.1, v3.4.2, v3.4.3, v3.4.4, v3.5.0.pre.1, v3.5.0.pre.2, v3.5.0, v3.5.1, v3.5.2, v3.5.3, v3.6.0.dev.1, v3.6.0.pre.1, v3.6.0.pre.2, v3.6.0.pre.3, v3.6.0, v3.6.1, v3.7.0.dev.1, v3.7.0.pre.1, v3.7.0, v3.8.0.pre.1 v3.8.0
-
- [typeprof] 0.30.1
-
debug 1.10.0
-
racc 1.8.1
The following bundled gems are promoted from default gems.
Supported platforms¶ ↑
Compatibility issues¶ ↑
-
Error messages and backtrace displays have been changed.
-
Use a single quote instead of a backtick as an opening quote. [Feature #16495]
-
Display a class name before a method name (only when the class has a permanent name). [Feature #19117]
-
Extra
rescue/ensureframes are no longer available on the backtrace. [Feature #20275] -
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 `' New:
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in ''
-
-
Hash#inspectrendering have been changed. [Bug #20433]-
Symbolkeys are displayed using the modern symbol key syntax:"{user: 1}" -
Other keys now have spaces around
=>:'{"user" => 1}', while previously they didn’t:'{"user"=>1}'
-
-
Kernel#Float()now accepts a decimal string with decimal part omitted. [Feature #20705]Float("1.") Float("1.E-1")
-
String#to_fnow accepts a decimal string with decimal part omitted. [Feature #20705] Note that the result changes when an exponent is specified."1.".to_f "1.E-1".to_f
-
Refinement#refined_classhas been removed. [Feature #19714]
Stdlib compatibility issues¶ ↑
C API updates¶ ↑
-
rb_newobjandrb_newobj_of(and corresponding macrosRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF) have been removed. [Feature #20265] -
Removed deprecated function
rb_gc_force_recycle. [Feature #18290]
Implementation improvements¶ ↑
-
The default parser is now
Prism. To use the conventional parser, use the command-line argument--parser=parse.y. [Feature #20564] -
Happy Eyeballs version 2 (RFC8305), an algorithm that ensures faster and more reliable connections by attempting IPv6 and IPv4 concurrently, is used in
Socket.tcpandTCPSocket.new. To disable it globally, set the environment variableRUBY_TCP_NO_FAST_FALLBACK=1or callSocket.tcp_fast_fallback=false. Or to disable it on a per-method basis, use the keyword argumentfast_fallback: false. [Feature #20108] [Feature #20782] -
Alternative garbage collector (
GC) implementations can be loaded dynamically through the modular garbage collector feature. To enable this feature, configure Ruby with--with-modular-gcat build time.GClibraries can be loaded at runtime using the environment variableRUBY_GC_LIBRARY. [Feature #20351] -
Ruby’s built-in garbage collector has been split into a separate file at
gc/default/default.cand interacts with Ruby using an API defined ingc/gc_impl.h. The built-in garbage collector can now also be built as a library usingmake modular-gc MODULAR_GC=defaultand enabled using the environment variableRUBY_GC_LIBRARY=default. [Feature #20470] -
An experimental
GClibrary is provided based on MMTk. ThisGClibrary can be built usingmake modular-gc MODULAR_GC=mmtkand enabled using the environment variableRUBY_GC_LIBRARY=mmtk. This requires the Rust toolchain on the build machine. [Feature #20860]
YJIT¶ ↑
New features¶ ↑
-
Add unified memory limit via
--yjit-mem-sizecommand-line option (default 128MiB) which tracks total YJIT memory usage and is more intuitive than the old--yjit-exec-mem-size. -
More statistics now always available via
RubyVM::YJIT.runtime_stats -
Add compilation log to track what gets compiled via
--yjit-log -
Tail of the log also available at run-time via
RubyVM::YJIT.log -
Add support for shareable consts in multi-ractor mode
-
Can now trace counted exits with
--yjit-trace-exits=COUNTER
New optimizations¶ ↑
-
Compressed context reduces memory needed to store YJIT metadata
-
Improved allocator with ability to allocate registers for local variables
-
When YJIT is enabled, use more Core primitives written in Ruby:
-
Array#each,Array#select,Array#maprewritten in Ruby for better performance [Feature #20182]. -
Ability to inline small/trivial methods such as:
-
Empty methods
-
Methods returning a constant
-
Methods returning
self -
Methods directly returning an argument
-
Specialized codegen for many more runtime methods
-
Optimize
String#getbyte,String#setbyteand other string methods -
Optimize bitwise operations to speed up low-level bit/byte manipulation
-
Various other incremental optimizations
Miscellaneous changes¶ ↑
-
Passing a block to a method which doesn’t use the passed block will show a warning on verbose mode (
-w). In connection with this, a newstrict_unused_blockwarning category was introduced. Turn them on with-W:strict_unused_blockorWarning[:strict_unused_block] = true. [Feature #15554] -
Redefining some core methods that are specially optimized by the interpreter and JIT like
String#freezeorInteger#+now emits a performance class warning (-W:performanceorWarning[:performance] = true). [Feature #20429]



