ruby/NEWS.md

5.5 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]]
    
  • 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:

    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]

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]
  • 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]
  • 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 --backtracse-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.

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

  • 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