ruby/spec already contains some specs for 3.4, but we should aim to cover all new features and important changes.
This will improve the test coverage of these features (and maybe discover a few bugs along the way), allow other Ruby implementations to implement the changes faster with more confidence and document clearly the new behavior.
The new specs should be within a version guard block:
ruby_version_is "3.4" do
# New specs
end
NOTE: https://rubyreferences.github.io/rubychanges/3.4.html gives more details for many features and changes.
Notes:
- Ractor & RubyVM related changes are removed since they are CRuby-specific.
From https://github.com/ruby/ruby/blob/master/doc/NEWS/NEWS-3.4.0.md:
NEWS 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
Core classes updates
Note: We're only listing outstanding class updates.
Array
Exception
Fiber::Scheduler
GC
Hash
IO::Buffer
Integer
MatchData
Object
Range
Rational
String
Symbol
Time
Warning
Stdlib updates
We only list stdlib changes that are notable feature changes.
RubyGems
Bundler
JSON
Tempfile
win32/sspi.rb
Socket
IRB
Compatibility issues
Stdlib compatibility issues
DidYouMean
Net::HTTP
Timeout
URI
C API updates
Implementation improvements
Miscellaneous changes
ruby/spec already contains some specs for 3.4, but we should aim to cover all new features and important changes.
This will improve the test coverage of these features (and maybe discover a few bugs along the way), allow other Ruby implementations to implement the changes faster with more confidence and document clearly the new behavior.
The new specs should be within a version guard block:
NOTE: https://rubyreferences.github.io/rubychanges/3.4.html gives more details for many features and changes.
Notes:
From https://github.com/ruby/ruby/blob/master/doc/NEWS/NEWS-3.4.0.md:
NEWS 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
itis added to reference a block parameter. [Feature #18980]String literals in files without a
frozen_string_literalcomment now emit a deprecation warningwhen 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 emita deprecation warning, offered as a replacement for the
str.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 warnedwhen
Warning[:deprecated]. [Feature #20884]Core classes updates
Note: We're only listing outstanding class updates.
Array
Array#fetch_valueswas added. [Feature #20702]Exception
Exception#set_backtracenow accepts arrays ofThread::Backtrace::Location.Kernel#raise,Thread#raiseandFiber#raisealso accept this new format. [Feature #13557]Fiber::Scheduler
Fiber::Scheduler#blocking_operation_waithook allows blocking operations to be moved out of theevent loop in order to reduce latency and improve multi-core processor utilization. [Feature #20876]
GC
GC.configadded to allow setting configuration variables on the GarbageCollector. [Feature #20443]
GC configuration parameter
rgengc_allow_full_markintroduced. WhenfalseGC will only mark young objects. Default is
true. [Feature #20443]Hash
Hash.newnow 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#copycan release the GVL, allowing other threads to run while copying data. [Feature #20902]Integer
Integer#**used to returnFloat::INFINITYwhen the return value is large, but now returns anInteger.If the return value is extremely large, it raises an exception.
[Feature #20811]
MatchData
MatchData#bytebeginandMatchData#byteendhave been added. [Feature #20576]Object
Object#singleton_methodnow returns methods in modules prepended to or included in thereceiver's singleton class. [Bug #20620]
Range
Range#sizenow raisesTypeErrorif the range is not iterable. [Misc #18984]Range#stepnow consistently has a semantics of iterating by using+operatorfor all types, not only numerics. [Feature #18368]
Rational
Rational#**used to returnFloat::INFINITYorFloat::NANwhen the numerator of the return value is large, but now returns an
Rational.If it is extremely large, it raises an exception. [Feature #20811]
String
String#append_as_byteswas 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
Symbol#to_snow emits a deprecation warning when mutated, and will befrozen in a future version of Ruby.
These warnings can be enabled with
-W:deprecatedor by settingWarning[:deprecated] = true.[Feature #20350]
Time
On Windows, now
Time#zoneencodes the system timezone name in UTF-8instead of the active code page, if it contains non-ASCII characters.
[Bug #20929]
Time#xmlschema, and itsTime#iso8601alias have been moved into the core Timeclass while previously it was an extension provided by the
timegem. [Feature #20707]Warning
Warning.categoriesmethod which returns a list of possible warning categories.[Feature #20293]
Stdlib updates
We only list stdlib changes that are notable feature changes.
RubyGems
--attestationoption to gem push. It enabled to store signature of build artifact to sigstore.dev.Bundler
lockfile_checksumsconfiguration to include checksums in fresh lockfiles.--add-checksumsto add checksums to an existing lockfile.JSON
JSON.parseabout 1.5 times faster than json-2.7.x.Tempfile
anonymous: trueis 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
[Feature #20775]
Socket
Socket::ResolutionErrorandSocket::ResolutionError#error_codewas added.[Feature #20018]
IRB
[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/ensureframes are no longer available on the backtrace. [Feature #20275]Kernel#caller,Thread::Backtrace::Location’s methods, etc. are also changed accordingly.Old:
New:
Hash#inspectrendering 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]String#to_fnow accepts a decimal string with decimal part omitted. [Feature #20705]Note that the result changes when an exponent is specified.
Refinement#refined_classhas 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::HTTPResponceReceiverTimeout
Timeout.timeout. [Bug #20795]URI
[Bug #19266]
C API updates
rb_newobjandrb_newobj_of(and corresponding macrosRB_NEWOBJ,RB_NEWOBJ_OF,NEWOBJ,NEWOBJ_OF) have been removed. [Feature #20265]rb_gc_force_recycle. [Feature #18290]Implementation improvements
by attempting IPv6 and IPv4 concurrently, is used in
Socket.tcpandTCPSocket.new.To disable it globally, set the environment variable
RUBY_TCP_NO_FAST_FALLBACK=1orcall
Socket.tcp_fast_fallback=false.Or to disable it on a per-method basis, use the keyword argument
fast_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 new
strict_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 classwarning (
-W:performanceorWarning[:performance] = true).[Feature #20429]