Skip to content

Latest commit

 

History

History
396 lines (242 loc) · 10.2 KB

File metadata and controls

396 lines (242 loc) · 10.2 KB

# -*- rdoc -*-

This document is a list of user visible feature changes made between releases except for bug fixes.

Note that each entry is kept so brief that no reason behind or reference information is supplied with. For a full list of changes with all sufficient information, see the ChangeLog file or Redmine (e.g. https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)

  • Pattern matching is introduced as an experimental feature. [Feature #14912]

  • Method reference operator, .: is introduced as an experimental feature. [Feature #12125] [Feature #13581]

  • Preparations for the redesign of keyword arguments towards Ruby 3. [Feature #14183]

    • Automatic conversion from a Hash to keyword arguments is deprecated: when a method call passes a Hash at the last argument, and when the called method accepts keywords, it is warned. Please add a double splat operator.

      def foo(key: 42); end; foo({key: 42})   # warned
      def foo(**kw);    end; foo({key: 42})   # warned
      def foo(key: 42); end; foo(**{key: 42}) # OK
      def foo(opt={});  end; foo( key: 42 )   # OK
      
    • Non-symbol keys are allowed as a keyword argument.

      def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
      
  • Automatic conversion of keyword arguments and positional ones is warned. [Feature #14183]

  • Proc.new and proc with no block in a method called with a block is warned now.

  • lambda with no block in a method called with a block errs.

  • Non-Symbol keys in a keyword arguments hash were prohibited in 2.6.0, but are now allowed again. [Bug #15658]

  • Numbered parameter as the default block parameter is introduced as an experimental feature. [Feature #4475]

  • A beginless range is experimentally introduced. It might not be as useful as an endless range, but would be good for DSL purpose. [Feature #14799]

    ary[..3]  # identical to ary[0..3]
    where(sales: ..100)
    
  • Setting $; to non-nil value is warned now. Use of it in String#split is warned too.

  • Setting $, to non-nil value is warned now. Use of it in Array#join is warned too.

  • Quoted here-document identifier must end within the same line.

    <<"EOS
    " # This has been warned since 2.4
    EOS
  • The flip-flop syntax deprecation is reverted. [Feature #5400]

  • Comment lines can be placed between fluent dot now.

    foo
      # .bar
      .baz # => foo.baz
    
  • Calling a private method with a literal self as the receiver is now allowed. [Feature #11297] [Feature #16123]

Complex
New method
  • Added Complex#<=>. So 0 <=> 0i will not raise NoMethodError. [Bug #15857]

Dir
Modified method
  • Dir#glob and Dir#[] no longer allow NUL-separated glob pattern. Use Array instead. [Feature #14643]

Encoding
  • Added new encoding CESU-8 [Feature #15931]

Enumerable
New methods
  • Added Enumerable#filter_map. [Feature #15323]

  • Added Enumerable#tally. [Feature #11076]

Enumerator
New method
  • Added Enumerator::Lazy#eager that generates a non-lazy enumerator from a lazy enumerator. [Feature #15901]

  • Added Enumerator::Yielder#to_proc so that a Yielder object can be directly passed to another method as a block argument. [Feature #15618]

Fiber
New method
  • Added Fiber#raise that behaves like Fiber#resume but raises an exception on the resumed fiber. [Feature #10344]

FrozenError
New method
  • Added FrozenError#receiver to return the frozen object that modification was attempted on. To set this object when raising FrozenError in Ruby code, pass it as the second argument to FrozenError.new.

GC
New method
  • Added GC.compact method for compacting the heap. This function compacts live objects in the heap so that fewer pages may be used, and the heap may be more CoW friendly. [Feature #15626]

    Details on the algorithm and caveats can be found here: bugs.ruby-lang.org/issues/15626

IO
New method
  • Added IO#set_encoding_by_bom to check the BOM and set the external encoding. [Bug #15210]

Integer
Modified method
  • Integer#[] now supports range operation. [Feature #8842]

    0b01001101[2, 4]  #=> 0b0011
    0b01001100[2..5]  #=> 0b0011
    0b01001100[2...6] #=> 0b0011
        ^^^^
Module
New method
  • Added Module#const_source_location to retrieve the location where a constant is defined. [Feature #10771]

Modified method
  • Module#autoload? now takes an inherit optional argument, like as Module#const_defined?. [Feature #15777]

ObjectSpace::WeakMap
Modified method
  • ObjectSpace::WeakMap#[]= now accepts special objects as either key or values. [Feature #16035]

Regexp / String
  • Update Unicode version and Emoji version from 11.0.0 to 12.0.0. [Feature #15321]

  • Update Unicode version to 12.1.0, adding support for U+32FF SQUARE ERA NAME REIWA. [Feature #15195]

RubyVM
Removed method
  • RubyVM.resolve_feature_path moved to $LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]

Time
New methods
  • Added Time#ceil method. [Feature #15772]

  • Added Time#floor method. [Feature #15653]

Modified method
  • Time#inspect is separated from Time#to_s and it shows its sub second.

    Feature #15958
UnboundMethod
New methods
  • Added UnboundMethod#bind_call method. [Feature #15955]

‘umethod.bind_call(obj, …)` is semantically equivalent to `umethod.bind(obj).call(…)`. This idiom is used in some libraries to call a method that is overridden. The added method does the same without allocation of intermediate Method object.

class Foo
  def add_1(x)
    x + 1
  end
end
class Bar < Foo
  def add_1(x) # override
    x + 2
  end
end

obj = Bar.new
p obj.add_1(1) #=> 3
p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2
p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
$LOAD_PATH
New method
  • Added $LOAD_PATH.resolve_feature_path. [Feature #15903] [Feature #15230]

Bundler
CGI
  • CGI.escapeHTML becomes 2~5x faster when there’s at least one escaped character.

CSV
Date
  • Date.jisx0301, Date#jisx0301, and Date.parse support the new Japanese era. [Feature #15742]

Delegator
  • Object#DelegateClass accepts a block and module_evals it in the context of the returned class, similar to Class.new and Struct.new.

ERB
  • Prohibit marshaling ERB instance.

IRB
  • Introduce syntax highlight inspired by pry.gem to Binding#irb source lines, REPL input, and inspect output of some core-class objects.

  • Introduce multiline mode by Reline.

  • Show documents when completion.

  • Enable auto indent and save/load history by default.

Net::FTP
  • Add features and options. [Feature #15964]

Net::IMAP
  • Add Server Name Indication (SNI) support. [Feature #15594]

open-uri
  • Warn open-uri’s “open” method at Kernel. Use URI.open instead. [Misc #15893]

  • The default charset of text/* media type is UTF-8 instead of ISO-8859-1. [Bug #15933]

Pathname
  • Delegates 3 arguments from Pathname.glob to Dir.glob to accept base: keyword.

Racc
  • Merge 1.4.15 from upstream repository and added cli of racc.

Reline
  • New stdlib that is compatible with readline stdlib by pure Ruby and also has a multiline mode.

RSS
RubyGems
  • Removed unmaintained libraries.

    • CMath

    • Scanf

    • Shell

    • Synchronizer

    • ThreadsWait

profile.rb, Profiler__
  • Removed from standard library. No one maintains it from Ruby 2.0.0.

* C API declarations with `ANYARGS` are changed not to use `ANYARGS`
  https://github.com/ruby/ruby/pull/2404
Fiber
  • Allow selecting different coroutine implementation by using --with-coroutine=, e.g.

    ./confgure --with-coroutine=ucontext
    ./confgure --with-coroutine=copy
  • Replace previous stack cache with fiber pool cache. The fiber pool allocates many stacks in a single memory region. Stack allocation becomes O(log N) and fiber creation is amortized O(1). Around 10x performance improvement was measured in micro-benchmarks.

Thread
  • VM stack memory allocation is now combined with native thread stack, improving thread allocation performance and reducing allocation related failures. ~10x performance improvement was measured in micro-benchmarks.

JIT
  • JIT-ed code is recompiled to less-optimized code when an optimization assumption is invalidated.

  • Method inlining is performed when a method is considered as pure. This optimization is still experimental and many methods are NOT considered as pure yet.

  • Default value of --jit-max-cache is changed from 1,000 to 100

  • Default value of --jit-min-calls is changed from 5 to 10,000

  • Support for IA64 architecture has been removed. Hardware for testing was difficult to find, native fiber code is difficult to implement, and it added non-trivial complexity to the interpreter. [Feature #15894]

  • Require compilers to support C99 [Misc #15347]

  • Ruby’s upstream repository is changed from Subversion to Git.

    • git.ruby-lang.org/ruby.git

    • RUBY_REVISION class is changed from Integer to String.

    • RUBY_DESCRIPTION includes Git revision instead of Subversion’s one.