曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.かつては雑草やヨモギと共に雨や露を分かち合っていたが、今では松やヒノキと共に霜や雪に耐えている。曾与蒿藜同雨露,Once sharing rain and dew with weeds and wormwood, now enduring frost and snow with pines and cypresses.终随松柏到冰霜.曾与蒿藜同雨露한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.,终随松柏到冰霜.譖セ荳手珍阯懷酔髮ィ髴イ�檎サ磯囂譚セ譟丞芦蜀ー髴�曾与蒿藜同雨露,鏇句笌钂胯棞鍚岄洦闇诧紝缁堥殢鏉炬煆鍒板啺闇�终随松柏到冰霜.曾与蒿藜同雨露,한때 잡초와 쑥과 함께 비와 이슬을 나누던 곳이 이제는 소나무와 삼나무와 함께 서리와 눈을 견뎌내고 있다.终随松柏到冰霜.曾与蒿藜同雨露,终随松柏到冰霜.
U:RDoc::TopLevel[ i I" NEWS:ETcRDoc::Parser::Simpleo:RDoc::Markup::Document:@parts[>S:RDoc::Markup::Heading:
leveli: textI"NEWS for Ruby 2.7.0;To:RDoc::Markup::BlankLine o:RDoc::Markup::Paragraph;[I"JThis document is a list of user visible feature changes made between ;TI"#releases except for bug fixes.;T@
o;
;[ I"NNote that each entry is kept so brief that no reason behind or reference ;TI"Hinformation is supplied with. For a full list of changes with all ;TI"?sufficient information, see the ChangeLog file or Redmine ;TI"N(e.g. <tt>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</tt>).;T@
S; ;
i;I"$Changes since the 2.6.0 release;T@
S; ;
i;I"Language changes;T@
S; ;
i ;I"Pattern matching;T@
o:RDoc::Markup::List:
@type:BULLET:@items[o:RDoc::Markup::ListItem:@label0;[o;
;[I"PPattern matching is introduced as an experimental feature. [Feature #14912];T@
o:RDoc::Markup::Verbatim;['I"case [0, [1, 2, 3]]
;TI"in [a, [b, *c]]
;TI" p a #=> 0
;TI" p b #=> 1
;TI" p c #=> [2, 3]
;TI" end
;TI"
;TI"case {a: 0, b: 1}
;TI"in {a: 0, x: 1}
;TI" :unreachable
;TI"in {a: 0, b: var}
;TI" p var #=> 1
;TI" end
;TI"
;TI"
case -1
;TI"in 0 then :unreachable
;TI"in 1 then :unreachable
;TI"$end #=> NoMatchingPatternError
;TI"
;TI"json = <<END
;TI"{
;TI" "name": "Alice",
;TI" "age": 30,
;TI"1 "children": [{ "name": "Bob", "age": 2 }]
;TI"}
;TI" END
;TI"
;TI"dJSON.parse(json, symbolize_names: true) in {name: "Alice", children: [{name: name, age: age}]}
;TI"
;TI"p name #=> "Bob"
;TI"p age #=> 2
;TI"
;TI"iJSON.parse(json, symbolize_names: true) in {name: "Alice", children: [{name: "Charlie", age: age}]}
;TI" #=> NoMatchingPatternError
;T:@format0o;;0;[o;
;[I"/See the following slides for more details:;To;;;;[o;;0;[o;
;[I"Ohttps://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7;To;;0;[o;
;[I"0Note that the slides are slightly obsolete.;T@
o;;0;[o;
;[I"AThe warning against pattern matching can be suppressed with ;TI"8{-W:no-experimental option}[#label-Warning+option].;T@
S; ;
i ;I"9The spec of keyword arguments is changed towards 3.0;T@
o;;;;[
o;;0;[o;
;[I"KAutomatic conversion of keyword arguments and positional arguments is ;TI"Ldeprecated, and conversion will be removed in Ruby 3. [Feature #14183];T@
o;;;;[ o;;0;[o;
;[
I"HWhen a method call passes a Hash at the last argument, and when it ;TI"Fpasses no keywords, and when the called method accepts keywords, ;TI"Ga warning is emitted. To continue treating the hash as keywords, ;TI"Aadd a double splat operator to avoid the warning and ensure ;TI" correct behavior in Ruby 3.;T@
o;;[ I"6def foo(key: 42); end; foo({key: 42}) # warned
;TI"6def foo(**kw); end; foo({key: 42}) # warned
;TI"2def foo(key: 42); end; foo(**{key: 42}) # OK
;TI"2def foo(**kw); end; foo(**{key: 42}) # OK
;T;0o;;0;[o;
;[
I"KWhen a method call passes keywords to a method that accepts keywords, ;TI"Dbut it does not pass enough required positional arguments, the ;TI"Ikeywords are treated as a final required positional argument, and a ;TI"Jwarning is emitted. Pass the argument as a hash instead of keywords ;TI"@to avoid the warning and ensure correct behavior in Ruby 3.;T@
o;;[ I"7def foo(h, **kw); end; foo(key: 42) # warned
;TI"7def foo(h, key: 42); end; foo(key: 42) # warned
;TI"3def foo(h, **kw); end; foo({key: 42}) # OK
;TI"3def foo(h, key: 42); end; foo({key: 42}) # OK
;T;0o;;0;[o;
;[
I"JWhen a method accepts specific keywords but not a keyword splat, and ;TI"Ia hash or keywords splat is passed to the method that includes both ;TI"ISymbol and non-Symbol keys, the hash will continue to be split, and ;TI"Ja warning will be emitted. You will need to update the calling code ;TI"Bto pass separate hashes to ensure correct behavior in Ruby 3.;T@
o;;[I"Gdef foo(h={}, key: 42); end; foo("key" => 43, key: 42) # warned
;TI"Gdef foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
;TI"Cdef foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
;T;0o;;0;[o;
;[I"HIf a method does not accept keywords, and is called with keywords, ;TI"Kthe keywords are still treated as a positional hash, with no warning. ;TI"3This behavior will continue to work in Ruby 3.;T@
o;;[I"2def foo(opt={}); end; foo( key: 42 ) # OK
;T;0o;;0;[o;
;[I"LNon-symbols are allowed as keyword argument keys if the method accepts ;TI")arbitrary keywords. [Feature #14183];T@
o;;;;[o;;0;[o;
;[I"KNon-Symbol keys in a keyword arguments hash were prohibited in 2.6.0, ;TI"-but are now allowed again. [Bug #15658];T@
o;;[I">def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
;T;0o;;0;[o;
;[I"L<code>**nil</code> is allowed in method definitions to explicitly mark ;TI"Nthat the method accepts no keywords. Calling such a method with keywords ;TI"6will result in an ArgumentError. [Feature #14183];T@
o;;[
I"?def foo(h, **nil); end; foo(key: 1) # ArgumentError
;TI"?def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
;TI"?def foo(h, **nil); end; foo("str" => 1) # ArgumentError
;TI"4def foo(h, **nil); end; foo({key: 1}) # OK
;TI"4def foo(h, **nil); end; foo({"str" => 1}) # OK
;T;0o;;0;[o;
;[ I"NPassing an empty keyword splat to a method that does not accept keywords ;TI"Lno longer passes an empty hash, unless the empty hash is necessary for ;TI"La required parameter, in which case a warning will be emitted. Remove ;TI"Nthe double splat to continue passing a positional hash. [Feature #14183];T@
o;;[ I".h = {}; def foo(*a) a end; foo(**h) # []
;TI":h = {}; def foo(a) a end; foo(**h) # {} and warning
;TI"0h = {}; def foo(*a) a end; foo(h) # [{}]
;TI".h = {}; def foo(a) a end; foo(h) # {}
;T;0o;;0;[o;
;[I"aAbove warnings can be suppressed also with {-W:no-deprecated option}[#label-Warning+option].;T@
S; ;
i ;I"Numbered parameters;T@
o;;;;[o;;0;[
o;
;[I"DNumbered parameters as default block parameters are introduced.;To;;:
LABEL;[o;;[I"Feature #4475;T;[o;;;;[o;;[I"81, 2, 10].map { _1.to_s(16) } #=> ["1", "2", "a";TI"/[1, 2], [3, 4]].map { _1 + _2 } #=> [3, 7;T;[@
o;
;[I"AYou can still define a local variable named +_1+ and so on, ;TI"=and that is honored when present, but renders a warning.;T@
o;;[I"c_1 = 0 #=> warning: `_1' is reserved for numbered parameter; consider another name
;TI"/[1].each { p _1 } # prints 0 instead of 1
;T;0S; ;
i ;I",proc/lambda without block is deprecated;T@
o;;;;[o;;0;[
o;
;[I"OProc.new and Kernel#proc with no block in a method called with a block is ;TI"warned now.;T@
o;;[ I"
def foo
;TI" proc
;TI" end
;TI"wfoo { puts "Hello" } #=> warning: Capturing the given block using Kernel#proc is deprecated; use `&block` instead
;T;0o;
;[I"ZThis warning can be suppressed with {-W:no-deprecated option}[#label-Warning+option].;T@
o;;0;[o;
;[I"UKernel#lambda with no block in a method called with a block raises an exception.;T@
o;;[ I"
def bar
;TI" lambda
;TI" end
;TI"Zbar { puts "Hello" } #=> tried to create Proc object without a block (ArgumentError)
;T;0S; ;
i ;I" Other miscellaneous changes;T@
o;;;;[o;;0;[o;
;[I"IA beginless range is experimentally introduced. It might be useful ;TI"Hin +case+, new call-sequence of the <code>Comparable#clamp</code>, ;TI"*constants and DSLs. [Feature #14799];T@
o;;[I"(ary[..3] # identical to ary[0..3]
;TI"
;TI"case RUBY_VERSION
;TI"#when ..."2.4" then puts "EOL"
;TI"# ...
;TI" end
;TI"
;TI"age.clamp(..100)
;TI"
;TI"where(sales: ..100)
;T;0o;;0;[o;
;[I"PSetting <code>$;</code> to a non-nil value is warned now. [Feature #14240] ;TI".Use of it in String#split is warned too. ;TI"ZThis warning can be suppressed with {-W:no-deprecated option}[#label-Warning+option].;T@
o;;0;[o;
;[I"PSetting <code>$,</code> to a non-nil value is warned now. [Feature #14240] ;TI",Use of it in Array#join is warned too. ;TI"ZThis warning can be suppressed with {-W:no-deprecated option}[#label-Warning+option].;T@
o;;0;[o;
;[I"DQuoted here-document identifiers must end within the same line.;T@
o;;[I"<<"EOS
;TI"E" # This had been warned since 2.4; Now it raises a SyntaxError
;TI" EOS
;T;0o;;0;[o;
;[I"BThe flip-flop syntax deprecation is reverted. [Feature #5400];T@
o;;0;[o;
;[I"8Comment lines can be placed between fluent dot now.;T@
o;;[I" foo
;TI" # .bar
;TI" .baz # => foo.baz
;T;0o;;0;[o;
;[I"DCalling a private method with a literal +self+ as the receiver ;TI"6is now allowed. [Feature #11297] [Feature #16123];T@
o;;0;[o;
;[I"MModifier rescue now operates the same for multiple assignment as single ;TI"assignment. [Bug #8279];T@
o;;[I" a, b = raise rescue [1, 2]
;TI":# Previously parsed as: (a, b = raise) rescue [1, 2]
;TI";# Now parsed as: a, b = (raise rescue [1, 2])
;T;0o;;0;[
o;
;[I"`+yield+ in singleton class syntax is warned and will be deprecated later. [Feature #15575].;T@
o;;[I"
def foo
;TI" class << Object.new
;TI"j yield #=> warning: `yield' in class syntax will not be supported from Ruby 3.0. [Feature #15575]
;TI" end
;TI" end
;TI"foo { p :ok }
;T;0o;
;[I"ZThis warning can be suppressed with {-W:no-deprecated option}[#label-Warning+option].;T@
o;;0;[
o;
;[I"NArgument forwarding by <code>(...)</code> is introduced. [Feature #16253];T@
o;;[I"def foo(...)
;TI" bar(...)
;TI" end
;T;0o;
;[ I"JAll arguments to +foo+ are forwarded to +bar+, including keyword and ;TI"block arguments. ;TI"NNote that the parentheses are mandatory. <code>bar ...</code> is parsed ;TI"as an endless range.;T@
o;;0;[o;
;[I"WAccess and setting of <code>$SAFE</code> is now always warned. <code>$SAFE</code> ;TI"Gwill become a normal global variable in Ruby 3.0. [Feature #16131];T@
o;;0;[o;
;[ I"Z<code>Object#{taint,untaint,trust,untrust}</code> and related functions in the C-API ;TI"Yno longer have an effect (all objects are always considered untainted), and are now ;TI"Wwarned in verbose mode. This warning will be disabled even in non-verbose mode in ;TI"\Ruby 3.0, and the methods and C functions will be removed in Ruby 3.2. [Feature #16131];T@
o;;0;[o;
;[I"YRefinements take place at Object#method and Module#instance_method. [Feature #15373];T@
S; ;
i;I"Command line options;T@
S; ;
i ;I"Warning option;T@
o;
;[I"SThe +-W+ option has been extended with a following +:+, to manage categorized ;TI"1warnings. [Feature #16345] [Feature #16420];T@
o;;;;[ o;;0;[o;
;[I"&To suppress deprecation warnings:;T@
o;;[ I"$ ruby -e '$; = ""'
;TI"'-e:1: warning: `$;' is deprecated
;TI"
;TI"*$ ruby -W:no-deprecated -e '$; = //'
;T;0o;;0;[o;
;[I"6It works with the +RUBYOPT+ environment variable:;T@
o;;[I"2$ RUBYOPT=-W:no-deprecated ruby -e '$; = //'
;T;0o;;0;[o;
;[I"/To suppress experimental feature warnings:;T@
o;;[ I"$ ruby -e '0 in a'
;TI"n-e:1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!
;TI"
;TI"+$ ruby -W:no-experimental -e '0 in a'
;T;0o;;0;[o;
;[I"ETo suppress both by using +RUBYOPT+, set space separated values:;T@
o;;[I"N$ RUBYOPT='-W:no-deprecated -W:no-experimental' ruby -e '($; = "") in a'
;T;0o;
;[I"iSee also Warning in {Core classes updates}[#label-Core+classes+updates+-28outstanding+ones+only-29].;T@
S; ;
i;I"1Core classes updates (outstanding ones only);T@
o;;: NOTE;[o;;[I"
Array;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"/Added Array#intersection. [Feature #16155];T@
o;;0;[o;
;[I"ZAdded Array#minmax, with a faster implementation than Enumerable#minmax. [Bug #15929];T@
o;;[I"Comparable;T;[o;;;;[o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"DComparable#clamp now accepts a Range argument. [Feature #14784];T@
o;;[I"-1.clamp(0..2) #=> 0
;TI" 1.clamp(0..2) #=> 1
;TI" 3.clamp(0..2) #=> 2
;TI"*# With beginless and endless ranges:
;TI"-1.clamp(0..) #=> 0
;TI" 3.clamp(..2) #=> 2
;T;0o;;[I"Complex;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[I"Added Complex#<=>. ;TI"HSo <code>0 <=> 0i</code> will not raise NoMethodError. [Bug #15857];T@
o;;[I"Dir;T;[o;;;;[o;;[I"Modified methods;T;[o;;;;[o;;0;[o;
;[I"EDir.glob and Dir.[] no longer allow NUL-separated glob pattern. ;TI")Use Array instead. [Feature #14643];T@
o;;[I"
Encoding;T;[o;;;;[o;;[I"New encoding;T;[o;;;;[o;;0;[o;
;[I"0Added new encoding CESU-8. [Feature #15931];T@
o;;[I"Enumerable;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"3Added Enumerable#filter_map. [Feature #15323];T@
o;;[I"F[1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
;T;0o;;0;[o;
;[I".Added Enumerable#tally. [Feature #11076];T@
o;;[I"B["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
;T;0o;;[I"Enumerator;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"HAdded Enumerator.produce to generate an Enumerator from any custom ;TI"+data transformation. [Feature #14781];T@
o;;[I"require "date"
;TI"Sdates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
;TI"/dates.detect(&:tuesday?) #=> next Tuesday
;T;0o;;0;[o;
;[I"GAdded Enumerator::Lazy#eager that generates a non-lazy enumerator ;TI".from a lazy enumerator. [Feature #15901];T@
o;;[ I"a = %w(foo bar baz)
;TI"=e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
;TI",p e.class #=> Enumerator
;TI"=p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]
;T;0o;;0;[o;
;[I"@Added Enumerator::Yielder#to_proc so that a Yielder object ;TI"9can be directly passed to another method as a block ;TI" argument. [Feature #15618];T@
o;;[I"
Fiber;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[I"DAdded Fiber#raise that behaves like Fiber#resume but raises an ;TI"6exception on the resumed fiber. [Feature #10344];T@
o;;[I" File;T;[o;;;;[o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"JFile.extname now returns a dot string for names ending with a dot on ;TI")non-Windows platforms. [Bug #15267];T@
o;;[I""File.extname("foo.") #=> "."
;T;0o;;[I"FrozenError;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[ I"EAdded FrozenError#receiver to return the frozen object on which ;TI"Bmodification was attempted. To set this object when raising ;TI"EFrozenError in Ruby code, FrozenError.new accepts a +:receiver+ ;TI"option. [Feature #15751];T@
o;;[I"GC;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[ o;
;[I"6Added GC.compact method for compacting the heap. ;TI"MThis function compacts live objects in the heap so that fewer pages may ;TI"Ube used, and the heap may be more CoW (copy-on-write) friendly. [Feature #15626];T@
o;
;[I"=Details on the algorithm and caveats can be found here: ;TI",https://bugs.ruby-lang.org/issues/15626;T@
o;;[I"IO;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[I"HAdded IO#set_encoding_by_bom to check the BOM and set the external ;TI"encoding. [Bug #15210];T@
o;;[I"Integer;T;[o;;;;[o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"?Integer#[] now supports range operations. [Feature #8842];T@
o;;[ I""0b01001101[2, 4] #=> 0b0011
;TI""0b01001100[2..5] #=> 0b0011
;TI""0b01001100[2...6] #=> 0b0011
;TI"# ^^^^
;T;0o;;[I"Method;T;[o;;;;[o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"<Method#inspect shows more information. [Feature #14145];T@
o;;[I"Module;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"IAdded Module#const_source_location to retrieve the location where a ;TI"+constant is defined. [Feature #10771];T@
o;;0;[o;
;[ I"IAdded Module#ruby2_keywords for marking a method as passing keyword ;TI"Harguments through a regular argument splat, useful when delegating ;TI"Dall arguments to another method in a way that can be backwards ;TI"7compatible with older Ruby versions. [Bug #16154];T@
o;;[I"Modified methods;T;[o;;;;[o;;0;[o;
;[I"EModule#autoload? now takes an +inherit+ optional argument, like ;TI"-Module#const_defined?. [Feature #15777];T@
o;;0;[o;
;[I"LModule#name now always returns a frozen String. The returned String is ;TI"8always the same for a given Module. This change is ;TI"#experimental. [Feature #16150];T@
o;;[I"&NilClass / TrueClass / FalseClass;T;[o;;;;[o;;[I"Modified methods;T;[o;;;;[o;;0;[o;
;[I"LNilClass#to_s, TrueClass#to_s, and FalseClass#to_s now always return a ;TI"Mfrozen String. The returned String is always the same for each of these ;TI":values. This change is experimental. [Feature #16150];T@
o;;[I"ObjectSpace::WeakMap;T;[o;;;;[o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"KObjectSpace::WeakMap#[]= now accepts special objects as either key or ;TI"values. [Feature #16035];T@
o;;[I" Proc;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[ I"GAdded Proc#ruby2_keywords for marking the proc as passing keyword ;TI"Harguments through a regular argument splat, useful when delegating ;TI"Lall arguments to another method or proc in a way that can be backwards ;TI";compatible with older Ruby versions. [Feature #16404];T@
o;;[I"
Range;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[I"NAdded Range#minmax, with a faster implementation than Enumerable#minmax. ;TI"IIt returns a maximum that now corresponds to Range#max. [Bug #15807];T@
o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I"TRange#=== now uses Range#cover? for String arguments, too (in Ruby 2.6, it was ;TI"Lchanged from Range#include? for all types except strings). [Bug #15449];T@
o;;[I"RubyVM;T;[o;;;;[o;;[I"Removed method;T;[o;;;;[o;;0;[o;
;[I",+RubyVM.resolve_feature_path+ moved to ;TI"U<code>$LOAD_PATH.resolve_feature_path</code>. [Feature #15903] [Feature #15230];T@
o;;[I"String;T;[o;;;;[o;;[I"Unicode;T;[o;;;;[o;;0;[o;
;[I"=Update Unicode version and Emoji version from 11.0.0 to ;TI"12.0.0. [Feature #15321];T@
o;;0;[o;
;[I":Update Unicode version to 12.1.0, adding support for ;TI"4U+32FF SQUARE ERA NAME REIWA. [Feature #15195];T@
o;;0;[o;
;[I";Update Unicode Emoji version to 12.1. [Feature #16272];T@
o;;[I"Symbol;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"MAdded Symbol#start_with? and Symbol#end_with? methods. [Feature #16348];T@
o;;[I" Time;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I".Added Time#ceil method. [Feature #15772];T@
o;;0;[o;
;[I"/Added Time#floor method. [Feature #15653];T@
o;;[I"Modified method;T;[o;;;;[o;;0;[o;
;[I";Time#inspect is separated from Time#to_s and it shows ;TI"-the time's sub second. [Feature #15958];T@
o;;[I"UnboundMethod;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[
o;
;[I"<Added UnboundMethod#bind_call method. [Feature #15955];T@
o;
;[
I"I<code>umethod.bind_call(obj, ...)</code> is semantically equivalent ;TI"Ito <code>umethod.bind(obj).call(...)</code>. This idiom is used in ;TI"Dsome libraries to call a method that is overridden. The added ;TI"Gmethod does the same without allocation of an intermediate Method ;TI"object.;T@
o;;[I"class Foo
;TI" def add_1(x)
;TI" x + 1
;TI" end
;TI" end
;TI"class Bar < Foo
;TI" def add_1(x) # override
;TI" x + 2
;TI" end
;TI" end
;TI"
;TI"obj = Bar.new
;TI"p obj.add_1(1) #=> 3
;TI";p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2
;TI";p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
;T;0o;;[I"Warning;T;[o;;;;[o;;[I"New methods;T;[o;;;;[o;;0;[o;
;[I"EAdded Warning.[] and Warning.[]= to manage emitting/suppressing ;TI"Dsome categories of warnings. [Feature #16345] [Feature #16420];T@
o;;[I"$LOAD_PATH;T;[o;;;;[o;;[I"New method;T;[o;;;;[o;;0;[o;
;[I"[Added <code>$LOAD_PATH.resolve_feature_path</code>. [Feature #15903] [Feature #15230];T@
S; ;
i;I"+Stdlib updates (outstanding ones only);T@
o;;;;[o;;[I"Bundler;T;[o;;;;[o;;0;[o;
;[I"Upgrade to Bundler 2.1.2. ;TI"?See https://github.com/bundler/bundler/releases/tag/v2.1.2;T@
o;;[I"CGI;T;[o;;;;[o;;0;[o;
;[I"VCGI.escapeHTML becomes 2~5x faster when there is at least one escaped character. ;TI"/See https://github.com/ruby/ruby/pull/2226;T@
o;;[I"CSV;T;[o;;;;[o;;0;[o;
;[I"Upgrade to 3.1.2. ;TI"9See https://github.com/ruby/csv/blob/master/NEWS.md.;T@
o;;[I" Date;T;[o;;;;[o;;0;[o;
;[I"KDate.jisx0301, Date#jisx0301, and Date.parse support the new Japanese ;TI"era. [Feature #15742];T@
o;;[I"Delegator;T;[o;;;;[o;;0;[o;
;[I"MObject#DelegateClass accepts a block and module_evals it in the context ;TI"@of the returned class, similar to Class.new and Struct.new.;T@
o;;[I"ERB;T;[o;;;;[o;;0;[o;
;[I"&Prohibit marshaling ERB instance.;T@
o;;[I"IRB;T;[o;;;;[ o;;0;[o;
;[I"JIntroduce syntax highlighting inspired by the Pry gem to Binding#irb ;TI"Msource lines, REPL input, and inspect output of some core-class objects.;T@
o;;0;[o;
;[I"9Introduce multiline editing mode provided by Reline.;T@
o;;0;[o;
;[I"(Show documentation when completion.;T@
o;;0;[o;
;[I"9Enable auto indent and save/load history by default.;T@
o;;[I" JSON;T;[o;;;;[o;;0;[o;
;[I"Upgrade to 2.3.0.;T@
o;;[I"
Net::FTP;T;[o;;;;[o;;0;[o;
;[I"OAdd Net::FTP#features to check available features, and Net::FTP#option to ;TI"3enable/disable each of them. [Feature #15964];T@
o;;[I"Net::HTTP;T;[o;;;;[o;;0;[o;
;[I"SAdd +ipaddr+ optional parameter to Net::HTTP#start to replace the address for ;TI"+the TCP/IP connection. [Feature #5180];T@
o;;[I"Net::IMAP;T;[o;;;;[o;;0;[o;
;[I"@Add Server Name Indication (SNI) support. [Feature #15594];T@
o;;[I"
open-uri;T;[o;;;;[o;;0;[o;
;[I".Warn open-uri's "open" method at Kernel. ;TI")Use URI.open instead. [Misc #15893];T@
o;;0;[o;
;[I"DThe default charset of "text/*" media type is UTF-8 instead of ;TI"ISO-8859-1. [Bug #15933];T@
o;;[I"OptionParser;T;[o;;;;[o;;0;[
o;
;[I"DNow show "Did you mean?" for unknown options. [Feature #16256];T@
o;
;[I"
test.rb:;T@
o;;[I"require "optparse"
;TI" OptionParser.new do |opts|
;TI", opts.on("-f", "--foo", "foo") {|v| }
;TI", opts.on("-b", "--bar", "bar") {|v| }
;TI", opts.on("-c", "--baz", "baz") {|v| }
;TI"end.parse!
;T;0o;
;[I"
example:;T@
o;;[
I"$ ruby test.rb --baa
;TI"(Traceback (most recent call last):
;TI"Ptest.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption)
;TI"Did you mean? baz
;TI" bar
;T;0o;;[I"
Pathname;T;[o;;;;[o;;0;[o;
;[I"9Pathname.glob now delegates 3 arguments to Dir.glob ;TI"/to accept +base+ keyword. [Feature #14405];T@
o;;[I" Racc;T;[o;;;;[o;;0;[o;
;[I"AMerge 1.4.15 from upstream repository and added cli of racc.;T@
o;;[I"Reline;T;[o;;;;[o;;0;[o;
;[I"CNew stdlib that is compatible with the readline stdlib but is ;TI"Iimplemented in pure Ruby. It also provides a multiline editing mode.;T@
o;;[I"
REXML;T;[o;;;;[o;;0;[o;
;[I"Upgrade to 3.2.3. ;TI";See https://github.com/ruby/rexml/blob/master/NEWS.md.;T@
o;;[I"RSS;T;[o;;;;[o;;0;[o;
;[I"Upgrade to RSS 0.2.8. ;TI"9See https://github.com/ruby/rss/blob/master/NEWS.md.;T@
o;;[I"
RubyGems;T;[o;;;;[o;;0;[o;
;[I"Upgrade to RubyGems 3.1.2.;To;;;;[o;;0;[o;
;[I"=https://github.com/rubygems/rubygems/releases/tag/v3.1.0;To;;0;[o;
;[I"=https://github.com/rubygems/rubygems/releases/tag/v3.1.1;To;;0;[o;
;[I"=https://github.com/rubygems/rubygems/releases/tag/v3.1.2;T@
o;;[I"StringScanner;T;[o;;;;[o;;0;[o;
;[I"Upgrade to 1.0.3. ;TI"=See https://github.com/ruby/strscan/blob/master/NEWS.md.;T@
S; ;
i;I"7Compatibility issues (excluding feature bug fixes);T@
o;;;;[o;;0;[o;
;[I"9The following libraries are no longer bundled gems. ;TI"6Install corresponding gems to use these features.;To;;;;[o;;0;[o;
;[I"CMath (cmath gem);To;;0;[o;
;[I"Scanf (scanf gem);To;;0;[o;
;[I"Shell (shell gem);To;;0;[o;
;[I"Synchronizer (sync gem);To;;0;[o;
;[I"ThreadsWait (thwait gem);To;;0;[o;
;[I"E2MM (e2mmap gem);T@
o;;;;[o;;[I" Proc;T;[o;;;;[o;;0;[o;
;[I"7The Proc#to_s format was changed. [Feature #16101];T@
o;;[I"
Range;T;[o;;;;[o;;0;[o;
;[I"IRange#minmax used to iterate on the range to determine the maximum. ;TI"FIt now uses the same algorithm as Range#max. In rare cases (e.g. ;TI"Qranges of Floats or Strings), this may yield different results. [Bug #15807];T@
S; ;
i;I">Stdlib compatibility issues (excluding feature bug fixes);T@
o;;;;[o;;0;[o;
;[I"#Promote stdlib to default gems;To;;;;[o;;0;[o;
;[I">The following default gems were published on rubygems.org;To;;;;[o;;0;[o;
;[I"benchmark;To;;0;[o;
;[I"cgi;To;;0;[o;
;[I"
delegate;To;;0;[o;
;[I"getoptlong;To;;0;[o;
;[I"net-pop;To;;0;[o;
;[I"
net-smtp;To;;0;[o;
;[I"
open3;To;;0;[o;
;[I"pstore;To;;0;[o;
;[I"
readline;To;;0;[o;
;[I"readline-ext;To;;0;[o;
;[I"singleton;To;;0;[o;
;[I"AThe following default gems were only promoted at ruby-core, ;TI"+but not yet published on rubygems.org.;To;;;;[o;;0;[o;
;[I"monitor;To;;0;[o;
;[I"
observer;To;;0;[o;
;[I"timeout;To;;0;[o;
;[I"tracer;To;;0;[o;
;[I"uri;To;;0;[o;
;[I" yaml;To;;0;[o;
;[I"[The <tt>did_you_mean</tt> gem has been promoted up to a default gem from a bundled gem;T@
o;;;;[o;;[I"
pathname;T;[o;;;;[o;;0;[o;
;[ I"FKernel#Pathname when called with a Pathname argument now returns ;TI"Cthe argument instead of creating a new Pathname. This is more ;TI"Gsimilar to other Kernel methods, but can break code that modifies ;TI"Bthe return value and expects the argument not to be modified.;T@
o;;[I"profile.rb, Profiler__;T;[o;;;;[o;;0;[o;
;[I"IRemoved from standard library. It was unmaintained since Ruby 2.0.0.;T@
S; ;
i;I"C API updates;T@
o;;;;[o;;0;[o;
;[ I"JMany <code>*_kw</code> functions have been added for setting whether ;TI"Hthe final argument being passed should be treated as keywords. You ;TI"Emay need to switch to these functions to avoid keyword argument ;TI"Cseparation warnings, and to ensure correct behavior in Ruby 3.;T@
o;;0;[o;
;[I"GThe <code>:</code> character in rb_scan_args format string is now ;TI"Htreated as keyword arguments. Passing a positional hash instead of ;TI"7keyword arguments will emit a deprecation warning.;T@
o;;0;[o;
;[I"IC API declarations with +ANYARGS+ are changed not to use +ANYARGS+. ;TI"/See https://github.com/ruby/ruby/pull/2404;T@
S; ;
i;I" Implementation improvements;T@
o;;;;[
o;;[I"
Fiber;T;[o;;;;[o;;0;[o;
;[I"BAllow selecting different coroutine implementations by using ;TI"+--with-coroutine=+, e.g.;T@
o;;[I"-$ ./configure --with-coroutine=ucontext
;TI")$ ./configure --with-coroutine=copy
;T;0o;;0;[o;
;[
I"HReplace previous stack cache with fiber pool cache. The fiber pool ;TI"Gallocates many stacks in a single memory region. Stack allocation ;TI"Gbecomes O(log N) and fiber creation is amortized O(1). Around 10x ;TI"?performance improvement was measured in micro-benchmarks. ;TI"+https://github.com/ruby/ruby/pull/2224;T@
o;;[I" File;T;[o;;;;[o;;0;[o;
;[I"EFile.realpath now uses realpath(3) on many platforms, which can ;TI"8significantly improve performance. [Feature #15797];T@
o;;[I" Hash;T;[o;;;;[o;;0;[o;
;[I"BChange data structure of small Hash objects. [Feature #15602];T@
o;;[I"Monitor;T;[o;;;;[o;;0;[o;
;[I">Monitor class is written in C-extension. [Feature #16255];T@
o;;[I"Thread;T;[o;;;;[o;;0;[o;
;[I"JVM stack memory allocation is now combined with native thread stack, ;TI"Mimproving thread allocation performance and reducing allocation related ;TI"Sfailures. Around 10x performance improvement was measured in micro-benchmarks.;T@
o;;[I"JIT;T;[o;;;;[ o;;0;[o;
;[I"eJIT-ed code is recompiled to less-optimized code when an optimization assumption is invalidated.;T@
o;;0;[o;
;[I"GMethod inlining is performed when a method is considered as pure. ;TI"]This optimization is still experimental and many methods are NOT considered as pure yet.;T@
o;;0;[o;
;[I"IThe default value of +--jit-max-cache+ is changed from 1,000 to 100.;T@
o;;0;[o;
;[I"HThe default value of +--jit-min-calls+ is changed from 5 to 10,000.;T@
o;;[I"RubyVM;T;[o;;;;[o;;0;[o;
;[I"LPer-call-site method cache, which has been there since around 1.9, was ;TI"6improved: cache hit rate raised from 89% to 94%. ;TI"/See https://github.com/ruby/ruby/pull/2583;T@
o;;[I" RubyVM::InstructionSequence;T;[o;;;;[o;;0;[o;
;[I"MRubyVM::InstructionSequence#to_binary method generates compiled binary. ;TI"1The binary size is reduced. [Feature #16163];T@
S; ;
i;I"Miscellaneous changes;T@
o;;;;[ o;;0;[o;
;[I"NSupport for IA64 architecture has been removed. Hardware for testing was ;TI"Rdifficult to find, native fiber code is difficult to implement, and it added ;TI"@non-trivial complexity to the interpreter. [Feature #15894];T@
o;;0;[o;
;[I"4Require compilers to support C99. [Misc #15347];T@
o;;;;[o;;0;[o;
;[I"TDetails of our dialect: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/C99;T@
o;;0;[o;
;[I"BRuby's upstream repository is changed from Subversion to Git.;T@
o;;;;[o;;0;[o;
;[I"'https://git.ruby-lang.org/ruby.git;T@
o;;0;[o;
;[I";RUBY_REVISION class is changed from Integer to String.;T@
o;;0;[o;
;[I"HRUBY_DESCRIPTION includes Git revision instead of Subversion's one.;T@
o;;0;[o;
;[I"`Support built-in methods in Ruby with the <code>_\_builtin_</code> syntax. [Feature #16254];T@
o;
;[I"@Some methods are defined in *.rb (such as trace_point.rb). ;TI"PFor example, it is easy to define a method which accepts keyword arguments.;T:
@file@:0@omit_headings_from_table_of_contents_below0