mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			464 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			464 lines
		
	
	
	
		
			13 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
# -*- rdoc -*-
 | 
						|
 | 
						|
= NEWS for Ruby 2.7.0
 | 
						|
 | 
						|
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. <tt>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</tt>)
 | 
						|
 | 
						|
== Changes since the 2.6.0 release
 | 
						|
 | 
						|
=== Language changes
 | 
						|
 | 
						|
* Pattern matching is introduced as an experimental feature. [Feature #14912]
 | 
						|
 | 
						|
* Method reference operator, <code>.:</code> is introduced as an
 | 
						|
  experimental feature.  [Feature #12125] [Feature #13581]
 | 
						|
 | 
						|
* Automatic conversion of keyword arguments and positional arguments is
 | 
						|
  deprecated, and conversion will be removed in Ruby 3.  [Feature #14183]
 | 
						|
 | 
						|
  * When a method call passes a Hash at the last argument, and when it
 | 
						|
    passes no keywords, and when the called method accepts keywords, a
 | 
						|
    warning is emitted.  To continue treating as keywords, add a double
 | 
						|
    splat operator to avoid the warning and ensure correct behavior in
 | 
						|
    Ruby 3.
 | 
						|
 | 
						|
     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(**kw);    end; foo(**{key: 42}) # OK
 | 
						|
 | 
						|
  * When a method call passes keywords to a method that accepts keywords,
 | 
						|
    but it does not pass enough required positional arguments, the
 | 
						|
    keywords are treated as a final required positional argument, and a
 | 
						|
    warning is emitted.  Pass the argument as a hash instead of keywords
 | 
						|
    to avoid the warning and ensure correct behavior in Ruby 3.
 | 
						|
 | 
						|
     def foo(h, **kw); end; foo(key: 42)      # warned
 | 
						|
     def foo(h, key: 42); end; foo(key: 42)   # warned
 | 
						|
     def foo(h, **kw); end; foo({key: 42})    # OK
 | 
						|
     def foo(h, key: 42); end; foo({key: 42}) # OK
 | 
						|
 | 
						|
  * When a method accepts specific keywords but not a keyword splat, and
 | 
						|
    a hash or keywords splat is passed to the method that includes both
 | 
						|
    Symbol and non-Symbol keys, the hash will continue to be split, and
 | 
						|
    a warning will be emitted.  You will need to update the calling code
 | 
						|
    to pass separate hashes to ensure correct behavior in Ruby 3.
 | 
						|
 | 
						|
     def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # warned
 | 
						|
     def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
 | 
						|
     def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
 | 
						|
     def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
 | 
						|
 | 
						|
  * If a method does not accept keywords, and is called with keywords,
 | 
						|
    the keywords are still treated as a positional hash, with no warning.
 | 
						|
    This behavior will continue to work in Ruby 3.
 | 
						|
 | 
						|
     def foo(opt={});  end; foo( key: 42 )   # OK
 | 
						|
 | 
						|
* Non-symbols are allowed as a keyword argument keys if method accepts
 | 
						|
  arbitrary keywords. [Feature #14183]
 | 
						|
 | 
						|
   def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
 | 
						|
 | 
						|
* <code>**nil</code> is allowed in method definitions to explicitly mark
 | 
						|
  that the method accepts no keywords. Calling such a method with keywords
 | 
						|
  will result in an ArgumentError. [Feature #14183]
 | 
						|
 | 
						|
   def foo(h, **nil); end; foo(key: 1)       # ArgumentError
 | 
						|
   def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
 | 
						|
   def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
 | 
						|
   def foo(h, **nil); end; foo({key: 1})     # OK
 | 
						|
   def foo(h, **nil); end; foo({"str" => 1}) # OK
 | 
						|
 | 
						|
* Passing an empty keyword splat to a method that does not accept keywords
 | 
						|
  no longer passes an empty hash, unless the empty hash is necessary for
 | 
						|
  a required parameter, in which case a warning will be emitted.  Remove
 | 
						|
  the double splat to continue passing a positional hash.  [Feature #14183]
 | 
						|
 | 
						|
    h = {}; def foo(*a) a end; foo(**h) # []
 | 
						|
    h = {}; def foo(a) a end; foo(**h)  # {} and warning
 | 
						|
    h = {}; def foo(*a) a end; foo(h)   # [{}]
 | 
						|
    h = {}; def foo(a) a end; foo(h)    # {}
 | 
						|
 | 
						|
* Proc.new and Kernel#proc with no block in a method called with a block is
 | 
						|
  warned now.
 | 
						|
 | 
						|
* Kernel#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 <code>$;</code> to non-nil value is warned now.  Use of it in
 | 
						|
  String#split is warned too.
 | 
						|
 | 
						|
* Setting <code>$,</code> 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 <code>self</code> as the receiver
 | 
						|
  is now allowed. [Feature #11297] [Feature #16123]
 | 
						|
 | 
						|
=== Core classes updates (outstanding ones only)
 | 
						|
 | 
						|
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:
 | 
						|
      https://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
 | 
						|
             ^^^^
 | 
						|
 | 
						|
NilClass / TrueClass / FalseClass::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * NilClass#to_s, TrueClass#to_s and FalseClass#to_s now always returns a
 | 
						|
      frozen String. The returned String is always the same for each of these
 | 
						|
      values. This change is experimental. [Feature #16150]
 | 
						|
 | 
						|
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]
 | 
						|
 | 
						|
    * Module#name now always return a frozen String. The returned String is
 | 
						|
      always the same for a given Module. This change is
 | 
						|
      experimental. [Feature #16150]
 | 
						|
 | 
						|
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
 | 
						|
      <code>$LOAD_PATH.resolve_feature_path</code>.  [Feature #15903] [Feature #15230]
 | 
						|
 | 
						|
Symbol::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * Symbol#to_s now always returns a frozen String. The returned String
 | 
						|
      is always the same for a given Symbol.  This change is
 | 
						|
      experimental.  [Feature #16150]
 | 
						|
 | 
						|
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]
 | 
						|
 | 
						|
      <code>umethod.bind_call(obj, ...)</code> is semantically equivalent
 | 
						|
      to <code>umethod.bind(obj).call(...)</code>.  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 <code>$LOAD_PATH.resolve_feature_path</code>.  [Feature #15903] [Feature #15230]
 | 
						|
 | 
						|
=== Stdlib updates (outstanding ones only)
 | 
						|
 | 
						|
Bundler::
 | 
						|
 | 
						|
  * Upgrade to Bundler 2.1.0.pre.1
 | 
						|
    Bundled from https://github.com/bundler/bundler/commit/a53709556b95a914e874b22ed2116a46b0528852
 | 
						|
 | 
						|
CGI::
 | 
						|
 | 
						|
  * CGI.escapeHTML becomes 2~5x faster when there's at least one escaped character.
 | 
						|
 | 
						|
CSV::
 | 
						|
 | 
						|
  * Upgrade to 3.0.9.
 | 
						|
    See https://github.com/ruby/csv/blob/master/NEWS.md.
 | 
						|
 | 
						|
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::
 | 
						|
 | 
						|
  * Upgrade to RSS 0.2.8.
 | 
						|
    See https://github.com/ruby/rss/blob/master/NEWS.md.
 | 
						|
 | 
						|
RubyGems::
 | 
						|
 | 
						|
  * Upgrade to RubyGems 3.1.0.pre1
 | 
						|
    Bundled from https://github.com/rubygems/rubygems/commit/97b264f0fa248c864b6ee9a23d3ff1cdd217dddb
 | 
						|
 | 
						|
=== Compatibility issues (excluding feature bug fixes)
 | 
						|
 | 
						|
* Removed unmaintained libraries.
 | 
						|
  * CMath
 | 
						|
  * Scanf
 | 
						|
  * Shell
 | 
						|
  * Synchronizer
 | 
						|
  * ThreadsWait
 | 
						|
 | 
						|
=== Stdlib compatibility issues (excluding feature bug fixes)
 | 
						|
 | 
						|
profile.rb, Profiler__::
 | 
						|
 | 
						|
  * Removed from standard library. No one maintains it from Ruby 2.0.0.
 | 
						|
 | 
						|
=== C API updates
 | 
						|
 | 
						|
* C API declarations with +ANYARGS+ are changed not to use +ANYARGS+
 | 
						|
  https://github.com/ruby/ruby/pull/2404
 | 
						|
 | 
						|
=== Implementation improvements
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
=== Miscellaneous changes
 | 
						|
 | 
						|
* 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]
 | 
						|
 | 
						|
  * Details of our dialect: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99
 | 
						|
 | 
						|
* Ruby's upstream repository is changed from Subversion to Git.
 | 
						|
 | 
						|
  * https://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.
 |