NEWS – Documentation for Ruby 3.4
This document is a list of feature changes visible to the user since the 3.3.0 release, except for bug fixes.
Note that each entry is kept to a minimum, see the links for details.
Language changes¶ ↑
-
it
added to reference a block parameter. (Feature #18980) -
String
literal in files without afrozen_string_literal
comment now emits a deprecation warning when they are mutated. These warnings may apply to-W:deprecated
or by positioningWarning(:deprecated) = true
. To disable this change, you can run Ruby with the--disable-frozen-string-literal
command line arguments. (Feature #20205)-
String#+@
now duplicates when mutating string will issue a deprecation warning, offered as a replacement forstr.dup if str.frozen?
standard.
-
-
Keyword dissemination
nil
if calling methods are now supported.**nil
treated the same as**{}
no passing keywords, and not calling any conversion method. (Bug #20064) -
Block passing is no longer allowed in index assignment (eg
a(0, &b) = 1
). (Bug #19918) -
Keyword arguments are no longer allowed in index assignment (eg
a(0, kw: 1) = 2
). (Bug #20218) -
The toplevel name
::Ruby
is now reserved, and the meaning will be warned whenWarning(:deprecated)
. (Feature #20884)
Updates to the core class¶ ↑
Note: We only list notable class updates.
Stdlib updates¶ ↑
We only list stdlib changes that are unique feature changes.
-
RubyGems
-
input
--attestation
gem push option. This enables saving the signature of the build artifact in sigstore.dev. -
input
--attestation
gem push option. This enables saving the signature of the build artifact in sigstore.dev.
-
-
win32/sspi.rb
Other changes are listed in the following sections. we also list the release history from the previous compiled version which is Ruby 3.3.0 if it has a GitHub release.
The following default gem has been added.
The following default attributes have been updated.
-
RubyGems 3.6.2
-
benchmark 0.4.0
-
bundler 2.6.1
-
date 3.4.1
-
delegate 0.4.0
-
what_you_mean 2.0.0
-
digest 3.2.0
-
erb 4.0.4
-
error_highlight 0.7.0
-
and so on 1.4.5
-
fcntl 1.2.0
-
fiddle 1.1.6
-
fileutils 1.7.3
-
io-console 0.8.0
-
unblock 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-type 0.5.0
-
optparse 0.6.0
-
obstruct 0.6.1
-
street name 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
-
solutions 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
shellfish 0.2.2
-
singleton 0.3.0
-
stringio 3.1.2
-
strscan 3.1.2
-
syntax_suggest 2.0.2
-
temp file 0.3.1
-
PERIOD 0.4.1
-
timeout 0.4.3
-
tmpdir 0.3.1
-
kind 1.0.2
-
win32ole 1.9.1
-
yaml 0.4.0
-
zlib 3.2.1
The following gem bundle has been added.
Updated the following compiled gems.
-
least 5.25.4
-
power_expression 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
-
CHIEF 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
-
acc 1.8.1
The following compiled gems are promoted from the default gems.
Supported platforms¶ ↑
Compatibility issues¶ ↑
-
Error messages and backtraces displayed have been changed.
-
Use a single quote instead of a backtick as the opening quote. (Feature #16495)
-
Show the class name before the method name (if the class has a permanent name). (Feature #19117)
-
more
rescue
/ensure
frames are no longer available for backtrace. (Feature #20275) -
Kernel#caller
,Thread::Backtrace::Location
The methods, etc. were also changed accordingly.Road:
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#inspect
the rendering has been changed. (Bug #20433)-
Symbol
keys are displayed using modern symbolic key syntax:"{user: 1}"
-
Some keys now have spaces around them
=>
:'{"user" => 1}'
whereas before they did not:'{"user"=>1}'
-
-
Kernel#Float()
now accepts a decimal string with the decimal part omitted. (Feature #20705)Float("1.") Float("1.E-1")
-
String#to_f
now accepts a decimal string with the 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_class
has been removed. (Feature #19714)
Stdlib compatibility issues¶ ↑
C API updates¶ ↑
-
rb_newobj
andrb_newobj_of
(and corresponding macrosRB_NEWOBJ
,RB_NEWOBJ_OF
,NEWOBJ
,NEWOBJ_OF
) was deleted. (Feature #20265) -
Removed unused function
rb_gc_force_recycle
. (Feature #18290)
Implementation improvements¶ ↑
-
The default parser is now
Prism
. To use a custom 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 testing IPv6 and IPv4 simultaneously, is used in
Socket.tcp
andTCPSocket.new
. To disable it globally, set the environment variableRUBY_TCP_NO_FAST_FALLBACK=1
or callSocket.tcp_fast_fallback=false
. Or to disable it in every method, use the keyword argumentfast_fallback: false
. (Feature #20108)(Feature #20782) -
Alternative garbage collector (
GC
) implementations can be loaded dynamically via the modular garbage collector feature. To enable this feature, configure Ruby to--with-modular-gc
during construction.GC
Libraries can be loaded at runtime using an environment variableRUBY_GC_LIBRARY
. (Feature #20351) -
Ruby’s built-in garbage collector is split into a separate file in the
gc/default/default.c
and interacts with Ruby using an API defined in thegc/gc_impl.h
. The built-in garbage collector can also be built as a library functionmake modular-gc MODULAR_GC=default
and is enabled using an environment variableRUBY_GC_LIBRARY=default
. (Feature #20470) -
An experiment
GC
library provided based on MMTk. itGC
library can be built usingmake modular-gc MODULAR_GC=mmtk
and is enabled using an environment variableRUBY_GC_LIBRARY=mmtk
. It requires the Rust toolchain on the build machine. (Feature #20860)
YJIT¶ ↑
New features¶ ↑
-
Add the combined memory limit by
--yjit-mem-size
command-line option (default 128MiB) that tracks total YJIT memory usage and is more intuitive than before--yjit-exec-mem-size
. -
More statistics are now always available via
RubyVM::YJIT.runtime_stats
-
Add compilation log to track what gets compiled through
--yjit-log
-
Log tail is also available at run-time via
RubyVM::YJIT.log
-
Add support for shared consts in multi-ractor mode
-
Counted exits can now be tracked
--yjit-trace-exits=COUNTER
New optimizations¶ ↑
-
Compressed context reduces the memory required to store YJIT metadata
-
Improved allocator with the ability to allocate registers for local variables
-
When YJIT is enabled, use several Core primitives written in Ruby:
-
Array#each
,Array#select
,Array#map
rewritten in Ruby for better performance (Feature #20182). -
Ability to inline small/trivial methods such as:
-
Empty methods
-
Methods of returning to a constant
-
Return procedures
self
-
Methods that directly return an argument
-
Specialized codegen for many more runtime methods
-
Optimize
String#getbyte
,String#setbyte
and other rope methods -
Optimize bitwise operations to facilitate low-level bit/byte manipulation
-
Various additional optimizations
Various changes¶ ↑
-
Passing a block to a method that does not use the passed block will display a verbose mode warning (
-w
). In relation to this, a new onestrict_unused_block
warning category introduced. Turn them on-W:strict_unused_block
orWarning(:strict_unused_block) = true
. (Feature #15554) -
Change some core methods that are specially optimized by the interpreter and like JIT
String#freeze
orInteger#+
now emits a performance class warning (-W:performance
orWarning(:performance) = true
). (Feature #20429)
2024-12-25 05:49:00