5.8 KiB
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
-
String literals in files without a
frozen_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] -
itis added to reference a block parameter. [Feature #18980] -
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] -
GC.configadded to allow setting configuration variables on the Garbage Collector. [Feature #20443] -
GC configuration parameter
rgengc_allow_full_markintroduced. WhenfalseGC will only mark young objects. Default istrue. [Feature #20443]
Core classes updates
Note: We're only listing outstanding class updates.
-
Exception
- Exception#set_backtrace now accepts arrays of
Thread::Backtrace::Location.Kernel#raise,Thread#raiseandFiber#raisealso accept this new format. [Feature #13557]
- Exception#set_backtrace now accepts arrays of
-
Range
-
Range#size now raises TypeError 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](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]
-
-
RubyVM::AbstractSyntaxTree
- Add
RubyVM::AbstractSyntaxTree::Node#locationsmethod which returns location objects associated with the AST node. [Feature #20624] - Add
RubyVM::AbstractSyntaxTree::Locationclass which holds location information. [Feature #20624]
- Add
Stdlib updates
-
Tempfile
- The keyword argument
anonymous: trueis implemented forTempfile.create.Tempfile.create(anonymous: true)removes the created temporary file immediately. So applications don't need to remove the file. [Feature #20497]
- The keyword argument
The following default gems are updated.
- RubyGems 3.6.0.dev
- bundler 2.6.0.dev
- erb 4.0.4
- fiddle 1.1.3.dev
- io-console 0.7.2
- irb 1.14.0
- json 2.7.2
- logger 1.6.1
- net-http 0.4.1
- optparse 0.5.0
- prism 1.0.0
- rdoc 6.7.0
- reline 0.5.10
- resolv 0.4.0
- stringio 3.1.2.dev
- strscan 3.1.1.dev
- uri 0.13.1
- zlib 3.1.1
The following bundled gems are updated.
- minitest 5.25.1
- rake 13.2.1
- test-unit 3.6.2
- rexml 3.3.7
- rss 0.3.1
- net-ftp 0.3.7
- net-imap 0.4.16
- net-smtp 0.5.0
- rbs 3.5.3
- typeprof 0.21.11
- debug 1.9.2
- racc 1.8.1
The following bundled gems are promoted from default gems.
- mutex_m 0.2.0
- getoptlong 0.2.1
- base64 0.2.0
- bigdecimal 3.1.8
- observer 0.1.2
- abbrev 0.1.2
- resolv-replace 0.1.1
- rinda 0.2.0
- drb 2.2.1
- nkf 0.2.0
- syslog 0.1.2
- csv 3.3.0
See GitHub releases like GitHub Releases of Logger or changelog for details of the default gems or bundled gems.
Supported platforms
Compatibility issues
- Error messages and backtrace displays have been changed.
- Use a single quote instead of a backtick as a opening quote. [Feature #16495]
- Display a class name before a method name (only when the class has a permanent name). [Feature #19117]
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>'
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
Array#eachis rewritten in Ruby for better performance [Feature #20182].
JIT
Miscellaneous changes
-
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.freezeorInteger#+now emits a performance class warning (-W:performanceorWarning[:performance] = true). [Feature #20429]