mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			697 lines
		
	
	
	
		
			20 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			697 lines
		
	
	
	
		
			20 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
 | 
						|
 | 
						|
* Pattern matching is introduced as an experimental feature. [Feature #14912]
 | 
						|
 | 
						|
    case [0, [1, 2, 3]]
 | 
						|
    in [a, [b, *c]]
 | 
						|
      p a #=> 0
 | 
						|
      p b #=> 1
 | 
						|
      p c #=> [2, 3]
 | 
						|
    end
 | 
						|
 | 
						|
    case {a: 0, b: 1}
 | 
						|
    in {a: 0, x: 1}
 | 
						|
      :unreachable
 | 
						|
    in {a: 0, b: var}
 | 
						|
      p var #=> 1
 | 
						|
    end
 | 
						|
 | 
						|
    json = <<END
 | 
						|
    {
 | 
						|
      "name": "Alice",
 | 
						|
      "age": 30,
 | 
						|
      "children": [{ "name": "Bob", "age": 2 }]
 | 
						|
    }
 | 
						|
    END
 | 
						|
    case JSON.parse(json, symbolize_names: true)
 | 
						|
    in {name: "Alice", children: [{name: "Bob", age: age}]}
 | 
						|
      p age #=> 2
 | 
						|
    end
 | 
						|
 | 
						|
* See the following slides in detail
 | 
						|
  * https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7
 | 
						|
 | 
						|
==== The spec of keyword arguments is changed towards 3.0
 | 
						|
 | 
						|
* 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
 | 
						|
 | 
						|
  * 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]
 | 
						|
 | 
						|
  * Non-Symbol keys in a keyword arguments hash were prohibited in 2.6.0,
 | 
						|
    but are now allowed again.  [Bug #15658]
 | 
						|
 | 
						|
      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)    # {}
 | 
						|
 | 
						|
==== Numbered parameter
 | 
						|
 | 
						|
* Numbered parameter as the default block parameter is introduced as an
 | 
						|
  experimental feature.  [Feature #4475]
 | 
						|
 | 
						|
    [1, 2, 10].map { _1.to_s(16) } #=> ["1", "2", "a"]
 | 
						|
 | 
						|
  You can still define a local variable named _1 and so on, and that is honored when present, but renders warning.
 | 
						|
 | 
						|
    _1 = 0            #=> warning: `_1' is used as numbered parameter
 | 
						|
    [1].each { p _1 } # prints 0 instead of 1
 | 
						|
 | 
						|
==== proc/lambda without block is deprecated
 | 
						|
 | 
						|
* Proc.new and Kernel#proc with no block in a method called with a block is
 | 
						|
  warned now.
 | 
						|
 | 
						|
    def foo
 | 
						|
      proc
 | 
						|
    end
 | 
						|
    foo { puts "Hello" } #=> warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
 | 
						|
 | 
						|
* Kernel#lambda with no block in a method called with a block raises an exception.
 | 
						|
 | 
						|
    def bar
 | 
						|
      lambda
 | 
						|
    end
 | 
						|
    bar { puts "Hello" } #=> tried to create Proc object without a block (ArgumentError)
 | 
						|
 | 
						|
==== Other miscellaneous changes
 | 
						|
 | 
						|
* 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 had been warned since 2.4; Now it raises a SyntaxError
 | 
						|
     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]
 | 
						|
 | 
						|
* Modifier rescue now operates the same for multiple assignment as single
 | 
						|
  assignment:
 | 
						|
 | 
						|
    a, b = raise rescue [1, 2]
 | 
						|
    # Previously parsed as: (a, b = raise) rescue [1, 2]
 | 
						|
    # Now parsed as:         a, b = (raise rescue [1, 2])
 | 
						|
 | 
						|
* +yield+ in singleton class syntax is warned and will be deprecated later [Feature #15575].
 | 
						|
 | 
						|
   def foo
 | 
						|
     class << Object.new
 | 
						|
       yield #=> warning: `yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575]
 | 
						|
     end
 | 
						|
   end
 | 
						|
   foo { p :ok }
 | 
						|
 | 
						|
* Argument forwarding by <code>(...)</code> is introduced. [Feature #16253]
 | 
						|
 | 
						|
    def foo(...)
 | 
						|
      bar(...)
 | 
						|
    end
 | 
						|
 | 
						|
  All arguments to +foo+ are forwarded to +bar+, including keyword and
 | 
						|
  block arguments.
 | 
						|
  Note that the parentheses are mandatory.  `bar ...` is parsed as an endless range.
 | 
						|
 | 
						|
* Access and setting of <code>$SAFE</code> is now always warned. <code>$SAFE</code>
 | 
						|
  will become a normal global variable in Ruby 3.0. [Feature #16131]
 | 
						|
 | 
						|
* <code>Object#{taint,untaint,trust,untrust}</code> and related functions in the C-API
 | 
						|
  no longer have an effect (all objects are always considered untainted), and are now
 | 
						|
  warned in verbose mode. This warning will be disabled even in non-verbose mode in
 | 
						|
  Ruby 3.0, and the methods and C functions will be removed in Ruby 3.2. [Feature #16131]
 | 
						|
 | 
						|
=== Core classes updates (outstanding ones only)
 | 
						|
 | 
						|
Array::
 | 
						|
 | 
						|
  New method::
 | 
						|
 | 
						|
    * Added Array#intersection. [Feature #16155]
 | 
						|
 | 
						|
Comparable::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * Comparable#clamp now accepts a Range argument. [Feature #14784]
 | 
						|
 | 
						|
        -1.clamp(0..2) #=> 0
 | 
						|
         1.clamp(0..2) #=> 1
 | 
						|
         3.clamp(0..2) #=> 2
 | 
						|
 | 
						|
Complex::
 | 
						|
 | 
						|
  New method::
 | 
						|
 | 
						|
    * Added Complex#<=>. So 0 <=> 0i will not raise NoMethodError. [Bug #15857]
 | 
						|
 | 
						|
Dir::
 | 
						|
 | 
						|
  Modified methods::
 | 
						|
 | 
						|
    * Dir.glob and Dir.[] no longer allow NUL-separated glob pattern.
 | 
						|
      Use Array instead.  [Feature #14643]
 | 
						|
 | 
						|
Encoding::
 | 
						|
 | 
						|
  New encoding::
 | 
						|
 | 
						|
    * Added new encoding CESU-8 [Feature #15931]
 | 
						|
 | 
						|
Enumerable::
 | 
						|
 | 
						|
  New methods::
 | 
						|
 | 
						|
    * Added Enumerable#filter_map.  [Feature #15323]
 | 
						|
 | 
						|
        [1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
 | 
						|
 | 
						|
    * Added Enumerable#tally.  [Feature #11076]
 | 
						|
 | 
						|
        ["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
 | 
						|
 | 
						|
Enumerator::
 | 
						|
 | 
						|
  New methods::
 | 
						|
 | 
						|
    * Added Enumerator.produce to generate Enumerator from any custom
 | 
						|
      data-transformation.  [Feature #14781]
 | 
						|
 | 
						|
        require 'date'
 | 
						|
        dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
 | 
						|
        dates.detect(&:tuesday?) #=> next tuesday
 | 
						|
 | 
						|
    * Added Enumerator::Lazy#eager that generates a non-lazy enumerator
 | 
						|
      from a lazy enumerator.  [Feature #15901]
 | 
						|
 | 
						|
        a = %w(foo bar baz)
 | 
						|
        e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
 | 
						|
        p e.class               #=> Enumerator
 | 
						|
        p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
 | 
						|
 | 
						|
    * 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]
 | 
						|
 | 
						|
File::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * File.extname now returns a dot string at a name ending with a dot on
 | 
						|
      non-Windows platforms.  [Bug #15267]
 | 
						|
 | 
						|
          File.extname("foo.") #=> "."
 | 
						|
 | 
						|
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. [Feature #15751]
 | 
						|
 | 
						|
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
 | 
						|
             ^^^^
 | 
						|
 | 
						|
Method::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * Method#inspect shows much information. [Feature #14145]
 | 
						|
 | 
						|
Module::
 | 
						|
 | 
						|
  New methods::
 | 
						|
 | 
						|
    * Added Module#const_source_location to retrieve the location where a
 | 
						|
      constant is defined.  [Feature #10771]
 | 
						|
 | 
						|
    * Added Module#ruby2_keywords for marking a method as passing keyword
 | 
						|
      arguments through a regular argument splat, useful when delegating
 | 
						|
      all arguments to another method in a way that can be backwards
 | 
						|
      compatible with older Ruby versions.  [Bug #16154]
 | 
						|
 | 
						|
  Modified methods::
 | 
						|
 | 
						|
    * Module#autoload? now takes an +inherit+ optional argument, like as
 | 
						|
      Module#const_defined?.  [Feature #15777]
 | 
						|
 | 
						|
    * Module#name now always returns a frozen String. The returned String is
 | 
						|
      always the same for a given Module. This change is
 | 
						|
      experimental. [Feature #16150]
 | 
						|
 | 
						|
NilClass / TrueClass / FalseClass::
 | 
						|
 | 
						|
  Modified methods::
 | 
						|
 | 
						|
    * NilClass#to_s, TrueClass#to_s and FalseClass#to_s now always return a
 | 
						|
      frozen String. The returned String is always the same for each of these
 | 
						|
      values. This change is experimental. [Feature #16150]
 | 
						|
 | 
						|
ObjectSpace::WeakMap::
 | 
						|
 | 
						|
  Modified method::
 | 
						|
 | 
						|
    * ObjectSpace::WeakMap#[]= now accepts special objects as either key or
 | 
						|
      values.  [Feature #16035]
 | 
						|
 | 
						|
RubyVM::
 | 
						|
 | 
						|
  Removed method::
 | 
						|
 | 
						|
    * +RubyVM.resolve_feature_path+ moved to
 | 
						|
      <code>$LOAD_PATH.resolve_feature_path</code>.  [Feature #15903] [Feature #15230]
 | 
						|
 | 
						|
String::
 | 
						|
 | 
						|
  Unicode::
 | 
						|
 | 
						|
    * 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]
 | 
						|
 | 
						|
    * Update Unicode Emoji version to 12.1 [Feature #16272]
 | 
						|
 | 
						|
Symbol::
 | 
						|
 | 
						|
  New methods::
 | 
						|
 | 
						|
    * Added Symbol#start_with? and Symbol#end_with? method.  [Feature #16348]
 | 
						|
 | 
						|
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 method::
 | 
						|
 | 
						|
    * 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.3
 | 
						|
    See https://github.com/bundler/bundler/blob/2-1-stable/CHANGELOG.md#210pre3-november-12-2019
 | 
						|
 | 
						|
CGI::
 | 
						|
 | 
						|
  * CGI.escapeHTML becomes 2~5x faster when there's at least one escaped character.
 | 
						|
    https://github.com/ruby/ruby/pull/2226
 | 
						|
 | 
						|
CSV::
 | 
						|
 | 
						|
  * Upgrade to 3.1.2.
 | 
						|
    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 Net::FTP#features to check available features, and Net::FTP#option to
 | 
						|
    enable/disable each of them.  [Feature #15964]
 | 
						|
 | 
						|
Net::HTTP::
 | 
						|
 | 
						|
  * Add ipaddr optional parameter to Net::HTTP#start to replace the address for
 | 
						|
    TCP/IP connection [Feature #5180]
 | 
						|
 | 
						|
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]
 | 
						|
 | 
						|
OptionParser::
 | 
						|
 | 
						|
  * Now show "Did you mean?" for unknown option.  [Feature #16256]
 | 
						|
 | 
						|
    test.rb:
 | 
						|
 | 
						|
      require 'optparse'
 | 
						|
      OptionParser.new do |opts|
 | 
						|
        opts.on("-f", "--foo", "foo") {|v| }
 | 
						|
        opts.on("-b", "--bar", "bar") {|v| }
 | 
						|
        opts.on("-c", "--baz", "baz") {|v| }
 | 
						|
      end.parse!
 | 
						|
 | 
						|
    example:
 | 
						|
 | 
						|
      $ ruby test.rb --baa
 | 
						|
      Traceback (most recent call last):
 | 
						|
      test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption)
 | 
						|
      Did you mean?  baz
 | 
						|
                     bar
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
REXML::
 | 
						|
 | 
						|
  * Upgrade to 3.2.3.
 | 
						|
    See https://github.com/ruby/rexml/blob/master/NEWS.md.
 | 
						|
 | 
						|
RSS::
 | 
						|
 | 
						|
  * Upgrade to RSS 0.2.8.
 | 
						|
    See https://github.com/ruby/rss/blob/master/NEWS.md.
 | 
						|
 | 
						|
RubyGems::
 | 
						|
 | 
						|
  * Upgrade to RubyGems 3.1.0.pre3
 | 
						|
    See https://github.com/rubygems/rubygems/blob/3.1/History.txt#L3
 | 
						|
 | 
						|
StringScanner::
 | 
						|
 | 
						|
  * Upgrade to 1.0.3.
 | 
						|
    See https://github.com/ruby/strscan/blob/master/NEWS.md.
 | 
						|
 | 
						|
=== Compatibility issues (excluding feature bug fixes)
 | 
						|
 | 
						|
* The following libraries are no longer bundled gems.
 | 
						|
  Install corresponding gems to use these features.
 | 
						|
  * CMath (cmath gem)
 | 
						|
  * Scanf (scanf gem)
 | 
						|
  * Shell (shell gem)
 | 
						|
  * Synchronizer (sync gem)
 | 
						|
  * ThreadsWait (thwait gem)
 | 
						|
  * E2MM (e2mmap gem)
 | 
						|
 | 
						|
Proc::
 | 
						|
  * Proc#to_s format was changed. [Feature #16101]
 | 
						|
 | 
						|
=== Stdlib compatibility issues (excluding feature bug fixes)
 | 
						|
 | 
						|
* Promote stdlib to default gems
 | 
						|
  * The following default gems was published at rubygems.org
 | 
						|
    * benchmark
 | 
						|
    * cgi
 | 
						|
    * delegate
 | 
						|
    * getoptlong
 | 
						|
    * net-pop
 | 
						|
    * net-smtp
 | 
						|
    * open3
 | 
						|
    * pstore
 | 
						|
    * singleton
 | 
						|
  * The following default gems only promoted ruby-core, Not yet published at rubygems.org.
 | 
						|
    * monitor
 | 
						|
    * observer
 | 
						|
    * timeout
 | 
						|
    * tracer
 | 
						|
    * uri
 | 
						|
    * yaml
 | 
						|
 | 
						|
pathname::
 | 
						|
 | 
						|
  * Kernel#Pathname when called with a Pathname argument now returns
 | 
						|
    the argument instead of creating a new Pathname. This is more
 | 
						|
    similar to other Kernel methods, but can break code that modifies
 | 
						|
    the return value and expects the argument not to be modified.
 | 
						|
 | 
						|
profile.rb, Profiler__::
 | 
						|
 | 
						|
  * Removed from standard library. No one maintains it from Ruby 2.0.0.
 | 
						|
 | 
						|
=== C API updates
 | 
						|
 | 
						|
* Many <code>*_kw</code> functions have been added for setting whether
 | 
						|
  the final argument being passed should be treated as keywords. You
 | 
						|
  may need to switch to these functions to avoid keyword argument
 | 
						|
  separation warnings, and to ensure correct behavior in Ruby 3.
 | 
						|
 | 
						|
* The <code>:</code> character in rb_scan_args format string is now
 | 
						|
  treated as keyword arguments. Passing a positional hash instead of
 | 
						|
  keyword arguments will emit a deprecation warning.
 | 
						|
 | 
						|
* 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.
 | 
						|
 | 
						|
         ./configure --with-coroutine=ucontext
 | 
						|
         ./configure --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.
 | 
						|
 | 
						|
File::
 | 
						|
  * File.realpath now uses realpath(3) on many platforms, which can
 | 
						|
    significantly improve performance.
 | 
						|
 | 
						|
Hash::
 | 
						|
  * Change data structure of small Hash objects. [Feature #15602]
 | 
						|
 | 
						|
Monitor::
 | 
						|
  * Monitor class is written in C-extension. [Feature #16255]
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
* Support built-in methods in Ruby with `__builtin_` syntax. [Feature #16254]
 | 
						|
  Some methods are defined in *.rb (such as trace_point.rb).
 | 
						|
  For example, it is easy to define a method which accepts keyword arguments.
 |