зеркало из https://github.com/github/ruby.git
663 строки
18 KiB
Plaintext
663 строки
18 KiB
Plaintext
# -*- rdoc -*-
|
|
|
|
= NEWS for Ruby 2.6.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.5.0 release
|
|
|
|
=== Language changes
|
|
|
|
* <code>$SAFE</code> now is a process global state and can be set to 0 again. [Feature #14250]
|
|
|
|
* Refinements take place at block passing. [Feature #14223]
|
|
|
|
* Refinements take place at Kernel#public_send. [Feature #15326]
|
|
|
|
* Refinements take place at Kernel#respond_to?. [Feature #15327]
|
|
|
|
* +else+ without +rescue+ now causes a syntax error. [EXPERIMENTAL] [Feature #14606]
|
|
|
|
* Constant names may start with a non-ASCII capital letter. [Feature #13770]
|
|
|
|
* Endless ranges are introduced. You can use a Range that has no end,
|
|
like <code>(0..)</code> (or similarly <code>(0...)</code>). [Feature #12912]
|
|
|
|
The following shows typical use cases:
|
|
|
|
ary[1..] # identical to ary[1..-1]
|
|
(1...).each {|index| block } # infinite loop from index 1
|
|
ary.zip(1..) {|elem, index| block } # ary.each.with_index(1) { }
|
|
|
|
* Non-Symbol keys in a keyword arguments hash cause an exception.
|
|
|
|
* The "shadowing outer local variable" warning is removed. [Feature #12490]
|
|
|
|
You can now write the following without warning:
|
|
|
|
user = users.find {|user| cond(user) }
|
|
|
|
* Print +cause+ of the exception if the exception is not caught and printed
|
|
its backtraces and error message. [Feature #8257]
|
|
|
|
* The flip-flop syntax is deprecated. [Feature #5400]
|
|
|
|
=== Core classes updates (outstanding ones only)
|
|
|
|
Array::
|
|
|
|
New methods::
|
|
|
|
* Added Array#union and Array#difference instance methods. [Feature #14097]
|
|
|
|
Modified method::
|
|
|
|
* Array#to_h now accepts a block that maps elements to new key/value pairs. [Feature #15143]
|
|
|
|
Aliased methods::
|
|
|
|
* Array#filter is a new alias for Array#select. [Feature #13784]
|
|
* Array#filter! is a new alias for Array#select!. [Feature #13784]
|
|
|
|
Binding::
|
|
|
|
New method::
|
|
|
|
* Added Binding#source_location. [Feature #14230]
|
|
|
|
This method returns the source location of the binding, a 2-element
|
|
array of <code>__FILE__</code> and <code>__LINE__</code>.
|
|
Traditionally, the same information could be retrieved by
|
|
<code>eval("[__FILE__, __LINE__]", binding)</code>, but we are
|
|
planning to change this behavior so that Kernel#eval ignores
|
|
binding's source location [Bug #4352]. So, users should use this
|
|
newly-introduced method instead of Kernel#eval.
|
|
|
|
Dir::
|
|
|
|
New methods::
|
|
|
|
* Added Dir#each_child and Dir#children instance methods. [Feature #13969]
|
|
|
|
Enumerable::
|
|
|
|
New method::
|
|
|
|
* Enumerable#chain returns an enumerator object that iterates over the
|
|
elements of the receiver and then those of each argument
|
|
in sequence. [Feature #15144]
|
|
|
|
Modified method::
|
|
|
|
* Enumerable#to_h now accepts a block that maps elements to new key/value pairs. [Feature #15143]
|
|
|
|
Aliased method::
|
|
|
|
* Enumerable#filter is a new alias for Enumerable#select. [Feature #13784]
|
|
|
|
Enumerator::ArithmeticSequence::
|
|
|
|
* This is a new class to represent a generator of an arithmetic sequence,
|
|
that is a number sequence defined by a common difference. It can be used
|
|
for representing what is similar to Python's slice. You can get an
|
|
instance of this class from Numeric#step and Range#step.
|
|
|
|
Enumerator::Chain::
|
|
|
|
* This is a new class to represent a chain of enumerables that works as a
|
|
single enumerator, generated by such methods as Enumerable#chain and
|
|
Enumerator#+.
|
|
|
|
Enumerator::Lazy::
|
|
|
|
Aliased method::
|
|
|
|
* Enumerator::Lazy#filter is a new alias for
|
|
Enumerator::Lazy#select. [Feature #13784]
|
|
|
|
Enumerator::
|
|
|
|
New methods::
|
|
|
|
* Enumerator#+ returns an enumerator object that iterates over the
|
|
elements of the receiver and then those of the other operand. [Feature #15144]
|
|
|
|
ENV::
|
|
|
|
Modified method::
|
|
|
|
* ENV.to_h now accepts a block that maps names and values to new keys and values. [Feature #15143]
|
|
|
|
Exception::
|
|
|
|
New options::
|
|
|
|
* Exception#full_message takes +:highlight+ and +:order+
|
|
options. [Bug #14324]
|
|
|
|
Hash::
|
|
|
|
Modified methods::
|
|
|
|
* Hash#merge, Hash#merge!, and Hash#update now accept multiple
|
|
arguments. [Feature #15111]
|
|
|
|
* Hash#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
|
|
|
|
Aliased methods::
|
|
|
|
* Hash#filter is a new alias for Hash#select. [Feature #13784]
|
|
|
|
* Hash#filter! is a new alias for Hash#select!. [Feature #13784]
|
|
|
|
IO::
|
|
|
|
New option::
|
|
|
|
* Added new mode character <code>'x'</code> to open files for exclusive
|
|
access. [Feature #11258]
|
|
|
|
Kernel::
|
|
|
|
Aliased method::
|
|
|
|
* Kernel#then is a new alias for Kernel#yield_self. [Feature #14594]
|
|
|
|
New options::
|
|
|
|
* Kernel#Complex, Kernel#Float, Kernel#Integer, and
|
|
Kernel#Rational take an +:exception+ option to specify the way of
|
|
error handling. [Feature #12732]
|
|
|
|
* Kernel#system takes an +:exception+ option to raise an exception
|
|
on failure. [Feature #14386]
|
|
|
|
Incompatible changes::
|
|
|
|
* Kernel#system and Kernel#exec do not close non-standard file descriptors
|
|
(the default of the +:close_others+ option is changed to +false+,
|
|
but we still set the +FD_CLOEXEC+ flag on descriptors we
|
|
create). [Misc #14907]
|
|
|
|
KeyError::
|
|
|
|
New options::
|
|
|
|
* KeyError.new accepts +:receiver+ and +:key+ options to set receiver and
|
|
key in Ruby code. [Feature #14313]
|
|
|
|
Method::
|
|
|
|
New methods::
|
|
|
|
* Added Method#<< and Method#>> for Proc composition. [Feature #6284]
|
|
|
|
Module::
|
|
|
|
Modified methods::
|
|
|
|
* Module#method_defined?, Module#private_method_defined?, and
|
|
Module#protected_method_defined? now accept the second
|
|
parameter as optional. If it is +true+ (the default value), it checks
|
|
ancestor modules/classes, or checks only the class itself. [Feature #14944]
|
|
|
|
NameError::
|
|
|
|
New option::
|
|
|
|
* NameError.new accepts a +:receiver+ option to set receiver in Ruby
|
|
code. [Feature #14313]
|
|
|
|
NilClass::
|
|
|
|
New method::
|
|
|
|
* NilClass#=~ is added for compatibility. [Feature #15231]
|
|
|
|
NoMethodError::
|
|
|
|
New option::
|
|
|
|
* NoMethodError.new accepts a +:receiver+ option to set receiver in Ruby
|
|
code. [Feature #14313]
|
|
|
|
Numeric::
|
|
|
|
Incompatible changes::
|
|
|
|
* Numeric#step now returns an instance of the Enumerator::ArithmeticSequence
|
|
class rather than one of the Enumerator class.
|
|
|
|
OpenStruct::
|
|
|
|
Modified method::
|
|
|
|
* OpenStruct#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
|
|
|
|
Proc::
|
|
|
|
New methods::
|
|
|
|
* Added Proc#<< and Proc#>> for Proc composition. [Feature #6284]
|
|
|
|
Incompatible changes::
|
|
|
|
* Proc#call doesn't change <code>$SAFE</code> any more. [Feature #14250]
|
|
|
|
Random::
|
|
|
|
New method::
|
|
|
|
* Added Random.bytes. [Feature #4938]
|
|
|
|
Range::
|
|
|
|
New method::
|
|
|
|
* Added Range#% instance method. [Feature #14697]
|
|
|
|
Incompatible changes::
|
|
|
|
* Range#=== now uses the +#cover?+ instead of the +#include?+ method. [Feature #14575]
|
|
* Range#cover? now accepts a Range object. [Feature #14473]
|
|
* Range#step now returns an instance of the Enumerator::ArithmeticSequence
|
|
class rather than one of the Enumerator class.
|
|
|
|
Regexp/String::
|
|
|
|
* Update Unicode version from 10.0.0 to 11.0.0. [Feature #14802]
|
|
|
|
This includes a rewrite of the grapheme cluster (/\X/) algorithm
|
|
and special-casing for Georgian MTAVRULI on String#downcase.
|
|
|
|
* Update Emoji version from 5.0 to 11.0.0 [Feature #14802]
|
|
|
|
RubyVM::AbstractSyntaxTree::
|
|
|
|
New methods::
|
|
|
|
* RubyVM::AbstractSyntaxTree.parse parses a given string and returns AST
|
|
nodes. [experimental]
|
|
|
|
* RubyVM::AbstractSyntaxTree.parse_file parses a given file and returns AST
|
|
nodes. [experimental]
|
|
|
|
* RubyVM::AbstractSyntaxTree.of returns AST nodes of the given proc or
|
|
method. [experimental]
|
|
|
|
RubyVM::
|
|
|
|
New method::
|
|
|
|
* RubyVM.resolve_feature_path identifies the file that will be loaded by
|
|
"require(feature)". [experimental] [Feature #15230]
|
|
|
|
String::
|
|
|
|
* String#crypt is now deprecated. [Feature #14915]
|
|
|
|
New features::
|
|
|
|
* String#split yields each substring to the block if given. [Feature #4780]
|
|
|
|
Struct::
|
|
|
|
Modified method::
|
|
|
|
* Struct#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
|
|
|
|
Aliased method::
|
|
|
|
* Struct#filter is a new alias for Struct#select. [Feature #13784]
|
|
|
|
Time::
|
|
|
|
New features::
|
|
|
|
* Time.new and Time#getlocal accept a timezone object as well as
|
|
a UTC offset string. Time#+, Time#-, and Time#succ also preserve
|
|
the timezone. [Feature #14850]
|
|
|
|
TracePoint::
|
|
|
|
New features::
|
|
|
|
* "script_compiled" event is supported. [Feature #15287]
|
|
|
|
New methods::
|
|
|
|
* TracePoint#parameters [Feature #14694]
|
|
|
|
* TracePoint#instruction_sequence [Feature #15287]
|
|
|
|
* TracePoint#eval_script [Feature #15287]
|
|
|
|
Modified method::
|
|
|
|
* TracePoint#enable accepts new keywords "target:" and
|
|
"target_line:". [Feature #15289]
|
|
|
|
=== Stdlib updates (outstanding ones only)
|
|
|
|
BigDecimal::
|
|
|
|
Update to version 1.4.0. This version includes several compatibility
|
|
issues, see Compatibility issues section below for details.
|
|
|
|
Modified method::
|
|
|
|
* BigDecimal() accepts the new keyword "exception:" similar to Float().
|
|
|
|
Note for the differences among recent versions::
|
|
|
|
You should want to know the differences among recent versions of bigdecimal.
|
|
Please select the suitable version of bigdecimal according to the following
|
|
information.
|
|
|
|
* 1.3.5 has BigDecimal.new without "exception:" keyword. You can see the
|
|
deprecation warning of BigDecimal.new when you specify "-w" option.
|
|
BigDecimal(), BigDecimal.new, and Object#to_d methods are the same.
|
|
|
|
* 1.4.0 has BigDecimal.new with "exception:" keyword. You always see the
|
|
deprecation warning of BigDecimal.new. Object#to_d method is different
|
|
from BigDecimal() and BigDecimal.new.
|
|
|
|
* 2.0.0 will be released soon after releasing Ruby 2.6.0. This version
|
|
will not have the BigDecimal.new method.
|
|
|
|
Bundler::
|
|
|
|
* Add Bundler to Standard Library. [Feature #12733]
|
|
|
|
* Use 1.17.2, the latest stable version.
|
|
|
|
Coverage::
|
|
|
|
A oneshot_lines mode is added. [Feature #15022]
|
|
|
|
This mode checks "whether each line was executed at least once or not",
|
|
instead of "how many times each line was executed".
|
|
A hook for each line is fired at most once, and after it is fired
|
|
the hook flag is removed, i.e., it runs with zero overhead.
|
|
|
|
New options::
|
|
|
|
* Add +:oneshot_lines+ keyword argument to Coverage.start.
|
|
|
|
* Add +:stop+ and +:clear+ keyword arguments to Coverage.result.
|
|
If +clear+ is true, it clears the counters to zero.
|
|
If +stop+ is true, it disables coverage measurement.
|
|
|
|
New methods::
|
|
|
|
* Coverage.line_stub, which is a simple helper function that
|
|
creates the "stub" of line coverage from a given source code.
|
|
|
|
CSV::
|
|
|
|
* Upgrade to 3.0.2. This includes performance improvements especially
|
|
for writing. Writing is about 2 times faster.
|
|
See https://github.com/ruby/csv/blob/master/NEWS.md.
|
|
|
|
ERB::
|
|
|
|
New options::
|
|
|
|
* Add +:trim_mode+ and +:eoutvar+ keyword arguments to ERB.new.
|
|
Now non-keyword arguments other than the first one are softly deprecated
|
|
and will be removed when Ruby 2.5 becomes EOL. [Feature #14256]
|
|
|
|
* erb command's <tt>-S</tt> option is deprecated, and will be removed
|
|
in the next version.
|
|
|
|
FileUtils::
|
|
|
|
New methods::
|
|
|
|
* FileUtils#cp_lr. [Feature #4189]
|
|
|
|
Matrix::
|
|
|
|
New methods::
|
|
|
|
* Matrix#antisymmetric?, Matrix#skew_symmetric?
|
|
|
|
* Matrix#map!, Matrix#collect! [Feature #14151]
|
|
|
|
* Matrix#[]=
|
|
|
|
* Vector#map!, Vector#collect!
|
|
|
|
* Vector#[]=
|
|
|
|
Net::
|
|
|
|
New options::
|
|
|
|
* Add +:write_timeout+ keyword argument to Net::HTTP.new. [Feature #13396]
|
|
|
|
New methods::
|
|
|
|
* Add Net::HTTP#write_timeout and Net::HTTP#write_timeout=. [Feature #13396]
|
|
|
|
New constant::
|
|
|
|
* Add Net::HTTPClientException to deprecate Net::HTTPServerException,
|
|
whose name is misleading. [Bug #14688]
|
|
|
|
NKF::
|
|
|
|
* Upgrade to nkf v2.1.5
|
|
|
|
Psych::
|
|
|
|
* Upgrade to Psych 3.1.0
|
|
|
|
RDoc::
|
|
|
|
* Become about 2 times faster.
|
|
|
|
* Use SOURCE_DATE_EPOCH to generate files.
|
|
|
|
* Fix method line number that slipped off.
|
|
|
|
* Enable <code>--width</code>, <code>--exclude</code>,
|
|
and <code>--line-numbers</code> that were ignored.
|
|
|
|
* Add support for blockquote by ">>>" in default markup notation.
|
|
|
|
* Add support for "Raises" lines in TomDoc notation.
|
|
|
|
* Fix syntax error output.
|
|
|
|
* Fix many parsing bugs.
|
|
|
|
REXML::
|
|
|
|
* Upgrade to REXML 3.1.9.
|
|
See https://github.com/ruby/rexml/blob/master/NEWS.md.
|
|
|
|
Improved some XPath implementations::
|
|
|
|
* <code>concat()</code> function: Stringify all arguments before concatenating.
|
|
|
|
* <code>string()</code> function: Support context node.
|
|
|
|
* <code>string()</code> function: Support processing instruction node.
|
|
|
|
* Support <code>"*:#{ELEMENT_NAME}"</code> syntax in XPath 2.0.
|
|
|
|
Fixed some XPath implementations::
|
|
|
|
* <code>"//#{ELEMENT_NAME}[#{POSITION}]"</code> case
|
|
|
|
* <code>string()</code> function: Fix <code>function(document)</code>
|
|
returns nodes that are out of root elements.
|
|
|
|
* <code>"/ #{ELEMENT_NAME} "</code> case
|
|
|
|
* <code>"/ #{ELEMENT_NAME} [ #{PREDICATE} ]"</code> case
|
|
|
|
* <code>"/ #{AXIS}::#{ELEMENT_NAME}"</code> case
|
|
|
|
* <code>"#{N}-#{M}"</code> case: One or more white spaces were required
|
|
before <code>"-"</code>
|
|
|
|
* <code>"/child::node()"</code> case
|
|
|
|
* <code>"#{FUNCTION}()/#{PATH}"</code> case
|
|
|
|
* <code>"@#{ATTRIBUTE}/parent::"</code> case
|
|
|
|
* <code>"name(#{NODE_SET})"</code> case
|
|
|
|
RSS::
|
|
|
|
New options::
|
|
|
|
* RSS::Parser.parse now accepts options as Hash. +:validate+ ,
|
|
+:ignore_unknown_element+ , +:parser_class+ options are available.
|
|
|
|
RubyGems::
|
|
|
|
* Upgrade to RubyGems 3.0.1
|
|
|
|
* https://blog.rubygems.org/2018/12/19/3.0.0-released.html
|
|
|
|
* https://blog.rubygems.org/2018/12/23/3.0.1-released.html
|
|
|
|
Set::
|
|
|
|
Aliased method::
|
|
|
|
* Set#filter! is a new alias for Set#select!. [Feature #13784]
|
|
|
|
URI::
|
|
|
|
New constant::
|
|
|
|
* Add URI::File to handle the file URI scheme. [Feature #14035]
|
|
|
|
=== Compatibility issues (excluding feature bug fixes)
|
|
|
|
Dir::
|
|
|
|
* Dir.glob with <code>'\0'</code>-separated pattern list will be deprecated,
|
|
and is now warned. [Feature #14643]
|
|
|
|
File::
|
|
|
|
* File.read, File.binread, File.write, File.binwrite, File.foreach, and
|
|
File.readlines do not invoke external commands even if the path starts
|
|
with the pipe character <code>'|'</code>. [Feature #14245]
|
|
|
|
Object::
|
|
|
|
* Object#=~ is deprecated. [Feature #15231]
|
|
|
|
=== Stdlib compatibility issues (excluding feature bug fixes)
|
|
|
|
* These standard libraries have been promoted to default gems.
|
|
|
|
* e2mmap
|
|
* forwardable
|
|
* irb
|
|
* logger
|
|
* matrix
|
|
* mutex_m
|
|
* ostruct
|
|
* prime
|
|
* rexml
|
|
* rss
|
|
* shell
|
|
* sync
|
|
* thwait
|
|
* tracer
|
|
|
|
BigDecimal::
|
|
|
|
* The following methods are removed.
|
|
|
|
* BigDecimal.allocate
|
|
* BigDecimal.ver
|
|
|
|
* Every BigDecimal object is frozen. [Feature #13984]
|
|
|
|
* BigDecimal() parses the given string similar to Float().
|
|
|
|
* String#to_d parses the receiver string similar to String#to_f.
|
|
|
|
* BigDecimal.new will be removed in version 2.0.
|
|
|
|
Pathname::
|
|
|
|
* Pathname#read, Pathname#binread, Pathname#write, Pathname#binwrite,
|
|
Pathname#each_line and Pathname#readlines do not invoke external
|
|
commands even if the path starts with the pipe character <code>'|'</code>.
|
|
This follows [Feature #14245].
|
|
|
|
=== Implementation improvements
|
|
|
|
* Speedup Proc#call because we don't need to care about <code>$SAFE</code>
|
|
any more. [Feature #14318]
|
|
|
|
With +lc_fizzbuzz+ benchmark which uses Proc#call many times we can
|
|
measure x1.4 improvements. [Bug #10212]
|
|
|
|
* Speedup block.call where +block+ is passed block parameter. [Feature #14330]
|
|
|
|
Ruby 2.5 improves block passing performance. [Feature #14045]
|
|
|
|
Additionally, Ruby 2.6 improves the performance of passed block calling.
|
|
|
|
* Introduce an initial implementation of a JIT (Just-in-time) compiler. [Feature #14235] [experimental]
|
|
|
|
* <tt>--jit</tt> command line option is added to enable JIT. <tt>--jit-verbose=1</tt>
|
|
is good for inspection. See <tt>ruby --help</tt> for others.
|
|
* To generate machine code, this JIT compiler uses the C compiler used for building
|
|
the interpreter. Currently GCC, Clang, and Microsoft Visual C++ are supported for it.
|
|
* <tt>--disable-mjit-support</tt> option is added to configure. This is added for JIT debugging,
|
|
but if you get an error on building a header file for JIT, you can use this option to skip
|
|
building it as a workaround.
|
|
* rb_waitpid reimplemented on Unix-like platforms to maintain
|
|
compatibility with processes created for JIT [Bug #14867]
|
|
|
|
* VM generator script renewal; makes the generated VM more optimized. [GH-1779]
|
|
|
|
* Thread cache enabled for pthreads platforms (for Thread.new and
|
|
Thread.start). [Feature #14757]
|
|
|
|
* timer thread is eliminated for platforms with POSIX timers. [Misc #14937]
|
|
|
|
* Transient Heap (theap) is supported. [Bug #14858] [Feature #14989]
|
|
|
|
theap is a managed heap for short-living memory objects. For example,
|
|
making a small and short-living Hash object is x2 faster. With rdoc benchmark,
|
|
we measured 6-7% performance improvement.
|
|
|
|
* Native implementations (arm32, arm64, ppc64le, win32, win64, x86, amd64) of
|
|
coroutines to improve performance of Fiber significantly. [Feature #14739]
|
|
|
|
=== Miscellaneous changes
|
|
|
|
* On macOS, shared libraries no longer include a full version number of Ruby
|
|
in their names. This eliminates the burden of each teeny upgrade on the
|
|
platform that users need to rebuild every extension library.
|
|
|
|
Before::
|
|
* libruby.2.6.0.dylib
|
|
* libruby.2.6.dylib -> libruby.2.6.0.dylib
|
|
* libruby.dylib -> libruby.2.6.0.dylib
|
|
|
|
After::
|
|
* libruby.2.6.dylib
|
|
* libruby.dylib -> libruby.2.6.dylib
|
|
|
|
* Extracted misc/*.el files to https://github.com/ruby/elisp
|