ruby/NEWS

465 строки
13 KiB
Plaintext

# -*- 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.