Description
Any help is appreciated whether it is:
- implementing one of the Ruby 3.4 changes in TruffleRuby, and ensuring it is tested in specs or MRI tests and otherwise add specs. If adding specs please leave a comment here to mention you are working on adding these specs to avoid conflicts & duplicated work.
- adding specs for Ruby 3.4 changes, which is best done in ruby/spec directly, see Write specs for new Ruby 3.4 features and changes ruby/spec#1265
To make it easier to find good getting-started issues, I annotated items with easy
, medium
and hard
.
There is also pure ruby
for changes which should only affect Ruby code and not require any change to Java sources or any Java knowledge.
If there is no pure ruby
then some Java code is involved, but it should still be fairly straightforward if easy
or medium
.
hard
typically requires more knowledge about TruffleRuby implementation details.
[import]
means this needs the import of Ruby 3.4 sources to happen first.
If you'd like to start on some task please mention it here or edit the description directly for committers (to avoid duplicated work).
Notes:
- Ractor & RubyVM related changes are removed since they are CRuby-specific.
- Added non-performance warnings are usually skipped since it is rarely worth the effort and often gone in the next version
Full list of changes for Ruby 3.4.0
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
-
it
is added to reference a block parameter. [Feature #18980] -
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 settingWarning[:deprecated] = true
.
To disable this change, you can run Ruby with the--disable-frozen-string-literal
command line argument. [Feature #20205]String#+@
now duplicates when mutating the string would emit
a deprecation warning, offered as a replacement for the
str.dup if str.frozen?
pattern.
-
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 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
::Ruby
is reserved now, and the definition will be warned
whenWarning[:deprecated]
. [Feature #20884]
Core classes updates
Note: We're only listing outstanding class updates.
Array
-
Array#fetch_values
was added. [Feature #20702]
Exception
-
Exception#set_backtrace
now accepts arrays ofThread::Backtrace::Location
.
Kernel#raise
,Thread#raise
andFiber#raise
also accept this new format. [Feature #13557]
Fiber::Scheduler
- An optional
Fiber::Scheduler#blocking_operation_wait
hook allows blocking operations to be moved out of the
event loop in order to reduce latency and improve multi-core processor utilization. [Feature #20876]
GC
-
GC.config
added to allow setting configuration variables on the Garbage
Collector. [Feature #20443] -
GC configuration parameter
rgengc_allow_full_mark
introduced. Whenfalse
GC will only mark young objects. Default istrue
. [Feature #20443]
Hash
-
Hash.new
now accepts an optionalcapacity:
argument, to preallocate the hash with a given capacity.
This can improve performance when building large hashes incrementally by saving on reallocation and
rehashing of keys. [Feature #19236]
IO::Buffer
-
IO::Buffer#copy
can release the GVL, allowing other threads to run while copying data. [Feature #20902]
Integer
-
Integer#**
used to returnFloat::INFINITY
when the return value is large, but now returns anInteger
.
If the return value is extremely large, it raises an exception.
[Feature #20811]
MatchData
-
MatchData#bytebegin
andMatchData#byteend
have been added. [Feature #20576]
Object
-
Object#singleton_method
now returns methods in modules prepended to or included in the
receiver's singleton class. [Bug #20620]```rb o = Object.new o.extend(Module.new{def a = 1}) o.singleton_method(:a).call #=> 1 ```
Range
-
Range#size
now raisesTypeError
if the range is not iterable. [Misc #18984] -
Range#step
now consistently has a semantics of iterating by using+
operator
for all types, not only numerics. [Feature #18368]```ruby (Time.utc(2022, 2, 24)..).step(24*60*60).take(3) #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC] ```
Rational
-
Rational#**
used to returnFloat::INFINITY
orFloat::NAN
when the numerator of the return value is large, but now returns anRational
.
If it is extremely large, it raises an exception. [Feature #20811]
String
-
String#append_as_bytes
was added to more easily and efficiently work with binary buffers and protocols.
It directly concatenate the arguments into the string without any encoding validation or conversion.
[Feature #20594]
Symbol
- The string returned by
Symbol#to_s
now emits a deprecation warning when mutated, and will be
frozen in a future version of Ruby.
These warnings can be enabled with-W:deprecated
or by settingWarning[:deprecated] = true
.
[Feature #20350]
Time
-
On Windows, now
Time#zone
encodes the system timezone name in UTF-8
instead of the active code page, if it contains non-ASCII characters.
[Bug #20929] -
Time#xmlschema
, and itsTime#iso8601
alias have been moved into the core Time
class while previously it was an extension provided by thetime
gem. [Feature #20707]
Warning
- Add
Warning.categories
method which returns a list of possible warning categories.
[Feature #20293]
Stdlib updates
We only list stdlib changes that are notable feature changes.
RubyGems
- Add
--attestation
option to gem push. It enabled to store signature of build artifact to sigstore.dev.
Bundler
- Add a
lockfile_checksums
configuration to include checksums in fresh lockfiles. - Add bundle lock
--add-checksums
to add checksums to an existing lockfile.
JSON
- Performance improvements
JSON.parse
about 1.5 times faster than json-2.7.x.
Tempfile
- The keyword argument
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
- This library is now extracted from the Ruby repository to ruby/net-http-sspi.
[Feature #20775]
Socket
-
Socket::ResolutionError
andSocket::ResolutionError#error_code
was added.
[Feature #20018]
IRB
- Interactive method completion is now improved with type information by default.
[Feature #20778]
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
/ensure
frames 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 `<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]- Symbol keys 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}'
- Symbol keys are displayed using the modern symbol key syntax:
-
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. [Feature #20705]
Note that the result changes when an exponent is specified."1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
-
Refinement#refined_class
has been removed. [Feature #19714]
Stdlib compatibility issues
DidYouMean
-
DidYouMean::SPELL_CHECKERS[]=
andDidYouMean::SPELL_CHECKERS.merge!
are removed.
Net::HTTP
-
Removed the following deprecated constants:
*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
- Reject negative values for
Timeout.timeout
. [Bug #20795]
URI
- Switched default parser to RFC 3986 compliant from RFC 2396 compliant.
[Bug #19266]
C API updates
-
rb_newobj
andrb_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
- Happy Eyeballs version 2 (RFC8305), an algorithm that ensures faster and more reliable connections
by attempting IPv6 and IPv4 concurrently, is used inSocket.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 on a per-method basis, use the keyword argumentfast_fallback: false
.
[Feature #20108] [Feature #20782]
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_block
warning category was introduced.
Turn them on with-W:strict_unused_block
orWarning[:strict_unused_block] = true
.
[Feature #15554] -
Redefining some core methods that are specially optimized by the interpreter
and JIT likeString#freeze
orInteger#+
now emits a performance class
warning (-W:performance
orWarning[:performance] = true
).
[Feature #20429]
Metadata
Metadata
Assignees
Type
Projects
Status