Software & Apps

NEWS – Documentation for Ruby 3.4



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 a frozen_string_literal comment now emits a deprecation warning when they are mutated. These warnings may apply to -W:deprecated or by positioning Warning(: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 for str.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 when Warning(: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.

  • Bundler

  • JSON

  • Tempfile

  • win32/sspi.rb

  • Socket

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.

The following gem bundle has been added.

Updated the following compiled gems.

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::LocationThe 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 and rb_newobj_of (and corresponding macros RB_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 and TCPSocket.new. To disable it globally, set the environment variable RUBY_TCP_NO_FAST_FALLBACK=1 or call Socket.tcp_fast_fallback=false. Or to disable it in every method, use the keyword argument fast_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 variable RUBY_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 the gc/gc_impl.h. The built-in garbage collector can also be built as a library function make modular-gc MODULAR_GC=default and is enabled using an environment variable RUBY_GC_LIBRARY=default. (Feature #20470)

  • An experiment GC library provided based on MMTk. it GC library can be built using make modular-gc MODULAR_GC=mmtk and is enabled using an environment variable RUBY_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 one strict_unused_block warning category introduced. Turn them on -W:strict_unused_block or Warning(:strict_unused_block) = true. (Feature #15554)

  • Change some core methods that are specially optimized by the interpreter and like JIT String#freeze or Integer#+ now emits a performance class warning (-W:performance or Warning(:performance) = true). (Feature #20429)

2024-12-25 05:49:00

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button