ruby/NEWS.md

7.4 KiB

NEWS for Ruby 3.1.0

This document is a list of user visible feature changes since the 3.0.0 release, except for bug fixes.

Note that each entry is kept to a minimum, see links for details.

Language changes

  • Pin operator now takes an expression. [Feature #17411]

    Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
    #=> [[3, 5], [5, 7], [11, 13]]
    
  • Pin operator now supports instance, class, and global variables. [Feature #17724]

    @n = 5
    Prime.each_cons(2).lazy.find{_1 in [n, ^@n]}
    #=> [3, 5]
    
  • One-line pattern matching is no longer experimental.

  • Multiple assignment evaluation order has been made consistent with single assignment evaluation order. With single assignment, Ruby uses a left-to-right evaluation order. With this code:

    foo[0] = bar
    

    The following evaluation order is used:

    1. foo
    2. bar
    3. []= called on the result of foo

    In Ruby before 3.1.0, multiple assignment did not follow this evaluation order. With this code:

    ```ruby
    foo[0], bar.baz = a, b
    ```
    

    Versions of Ruby before 3.1.0 would evaluate in the following order

    1. a
    2. b
    3. foo
    4. []= called on the result of foo
    5. bar
    6. baz= called on the result of bar

    Starting in Ruby 3.1.0, evaluation order is now consistent with single assignment, with the left hand side being evaluated before the right hand side:

    1. foo
    2. bar
    3. a
    4. b
    5. []= called on the result of foo
    6. baz= called on the result of bar

    [Bug #4443]

  • Values in Hash literals and keyword arguments can be omitted. [Feature #14579]

    For example,

    • {x:, y:} is a syntax sugar of {x: x, y: y}.
    • foo(x:, y:) is a syntax sugar of foo(x: x, y: y).

    Constant names, local variable names, and method names are allowed as key names. Note that a reserved word is considered as a local variable or method name even if it's a pseudo variable name such as self.

Command line options

Core classes updates

Outstanding ones only.

  • Array

  • Enumerable

  • Enumerator::Lazy

  • File

    • File.dirname now accepts an optional argument for the level to strip path components. [Feature #12194]
  • Integer

  • MatchData

  • Module

    • Module#prepend now modifies the ancestor chain if the receiver already includes the argument. Module#prepend still does not modify the ancestor chain if the receiver has already prepended the argument. [Bug #17423]
  • Struct

    • Passing only keyword arguments to Struct#initialize is warned. You need to use a Hash literal to set a Hash to a first member. [Feature #16806]

    • StructClass#keyword_init? is added [Feature #18008]

  • String

  • Queue

    • Queue#initialize now accepts an Enumerable of initial values. [Feature #17327]
  • Thread

  • Thread::Backtrace

    • Thread::Backtrace.limit, which returns the value to limit backtrace length set by --backtrace-limit command line option, is added. [Feature #17479]
  • $LOAD_PATH

  • Fiber Scheduler

    • Add support for Addrinfo.getaddrinfo using address_resolve hook. [Feature #17370]

    • Introduce non-blocking Timeout.timeout using timeout_after hook. [Feature #17470]

    • IO hooks io_wait, io_read, io_write, receive the original IO object where possible. [Bug #18003]

    • Make Monitor fiber-safe. [Bug #17827]

    • Replace copy coroutine with pthread implementation. [Feature #18015]

Stdlib updates

Outstanding ones only.

Compatibility issues

Excluding feature bug fixes.

  • rb_io_wait_readable, rb_io_wait_writable and rb_wait_for_single_fd are deprecated in favour of rb_io_maybe_wait_readable, rb_io_maybe_wait_writable and rb_io_maybe_wait respectively. rb_thread_wait_fd and rb_thread_fd_writable are deprecated. [Bug #18003]

Stdlib compatibility issues

  • ERB#initialize warns safe_level and later arguments even without -w. [Feature #14256]

C API updates

Implementation improvements

JIT

  • The default --jit-max-cache is changed from 100 to 10000.

  • JIT-ed code is no longer cancelled when a TracePoint for class events is enabled.

  • The JIT compiler no longer skips compilation of methods longer than 1000 instructions.

  • --jit-verbose and --jit-warning output "JIT cancel" when JIT-ed code is disabled because TracePoint or GC.compact is used.

  • RubyVM::MJIT is renamed to RubyVM::JIT. [Feature #17490]

Static analysis

RBS

TypeProf

Miscellaneous changes

  • lib/objspace/trace.rb is added, which is a tool for tracing the object allocation. Just by requiring this file, tracing is started immediately. Just by Kernel#p, you can investigate where an object was created. Note that just requiring this file brings a large performance overhead. This is only for debugging purpose. Do not use this in production. [Feature #17762]

  • Now exceptions raised in finalizers will be printed to STDERR, unless $VERBOSE is nil. [Feature #17798]