
[Feature #20205] As a path toward enabling frozen string literals by default in the future, this commit introduce "chilled strings". From a user perspective chilled strings pretend to be frozen, but on the first attempt to mutate them, they lose their frozen status and emit a warning rather than to raise a `FrozenError`. Implementation wise, `rb_compile_option_struct.frozen_string_literal` is no longer a boolean but a tri-state of `enabled/disabled/unset`. When code is compiled with frozen string literals neither explictly enabled or disabled, string literals are compiled with a new `putchilledstring` instruction. This instruction is identical to `putstring` except it marks the String with the `STR_CHILLED (FL_USER3)` and `FL_FREEZE` flags. Chilled strings have the `FL_FREEZE` flag as to minimize the need to check for chilled strings across the codebase, and to improve compatibility with C extensions. Notes: - `String#freeze`: clears the chilled flag. - `String#-@`: acts as if the string was mutable. - `String#+@`: acts as if the string was mutable. - `String#clone`: copies the chilled flag. Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
3.5 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_literal
comment now behave as if they were frozen. If they are mutated a deprecation warning is emited. 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] -
it
is added to reference a block parameter. [Feature #18980] -
Keyword splatting
nil
when calling methods is now supported.**nil
is treated similar to**{}
, passing no keywords, and not calling any conversion methods. [Bug #20064] -
Block passing is no longer allowed in index. [Bug #19918]
-
Keyword arguments are no longer allowed in index. [Bug #20218]
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#raise
andFiber#raise
also accept this new format. [Feature #13557]
- Exception#set_backtrace now accepts arrays of
Stdlib updates
The following default gems are updated.
- RubyGems 3.6.0.dev
- bundler 2.6.0.dev
- erb 4.0.4
- fiddle 1.1.3
- io-console 0.7.2
- irb 1.12.0
- net-http 0.4.1
- prism 0.24.0
- reline 0.4.3
- resolv 0.4.0
- stringio 3.1.1
- strscan 3.1.1
The following bundled gems are updated.
- minitest 5.22.3
- test-unit 3.6.2
- net-ftp 0.3.4
- net-imap 0.4.10
- net-smtp 0.4.0.1
- rbs 3.4.4
- typeprof 0.21.11
- debug 1.9.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.7
- 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.2.8
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_newobj
andrb_newobj_of
(and corresponding macrosRB_NEWOBJ
,RB_NEWOBJ_OF
,NEWOBJ
,NEWOBJ_OF
) have been removed [Feature #20265].
Implementation improvements
Array#each
is rewritten in Ruby for better performance [Feature #20182].