mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 1692ccaf9f
			
		
	
	
		1692ccaf9f
		
	
	
	
	
		
			
			git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66252 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			593 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			593 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # -*- 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> is a process global state and we can set 0 again. [Feature #14250]
 | |
| 
 | |
| * refinements takes place at block passing.  [Feature #14223]
 | |
| 
 | |
| * refinements takes place at Kernel#public_send.  [Feature #15326]
 | |
| 
 | |
| * refinements takes place at Kernel#respond_to?.  [Feature #15327]
 | |
| 
 | |
| * +else+ without +rescue+ now causes a syntax error.  [EXPERIMENTAL]
 | |
| 
 | |
| * constant names may start with a non-ASCII capital letter. [Feature #13770]
 | |
| 
 | |
| * An endless range is introduced.  You can write a range that has no end,
 | |
|   like <code>(0..)</code>.  The following shows typical use cases.  [Feature #12912]
 | |
| 
 | |
|     ary[1..]                            # identical to ary[1..-1]
 | |
|     (1..).each {|index| ... }           # infinite loop from index 1
 | |
|     ary.zip(1..) {|elem, index| ... }   # ary.each.with_index(1) { }
 | |
| 
 | |
| * Non-Symbol key in keyword arguments hash causes an exception.
 | |
| 
 | |
| * "shadowing outer local variable" warning was removed.  [Feature #12490]
 | |
|   You can now write the following without warning.
 | |
| 
 | |
|     user = users.find {|user| cond(user) }
 | |
| 
 | |
| * Print exception backtrace and error message in reverse order when the
 | |
|   exception is not caught and STDOUT is unchanged and a tty. [Feature #8661]
 | |
| 
 | |
| * Print +cause+ of the exception if the exception is not caught and printed
 | |
|   its backtraces and error message [Feature #8257]
 | |
| 
 | |
| === Core classes updates (outstanding ones only)
 | |
| 
 | |
| [Array]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * Added Array#union and Array#difference instance methods.  [Feature #14097]
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|     * Array#to_h now maps elements to new keys and values by the
 | |
|       block if given.  [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 methods]
 | |
| 
 | |
|     * 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 methods]
 | |
| 
 | |
|     * 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 methods]
 | |
| 
 | |
|     * Enumerable#to_h now maps elements to new keys and values by the block if
 | |
|       given.  [Feature #15143]
 | |
| 
 | |
|   [Aliased methods]
 | |
| 
 | |
|     * Enumerable#filter is a new alias for Enumerable#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]
 | |
| 
 | |
| [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 methods]
 | |
| 
 | |
|     * Enumerator::Lazy#filter is a new alias for
 | |
|       Enumerator::Lazy#select.  [Feature #13784]
 | |
| 
 | |
| [ENV]
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|     * ENV.to_h now maps names and values to new keys and values
 | |
|       by the block if given.  [Feature #15143]
 | |
| 
 | |
| [Exception]
 | |
| 
 | |
|   [New options]
 | |
| 
 | |
|     * Exception#full_message takes +:highlight+ and +:order+
 | |
|       options. [Bug #14324]
 | |
| 
 | |
| [Hash]
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|     * Hash#merge, merge!, and update now accept multiple
 | |
|       arguments.  [Feature #15111]
 | |
| 
 | |
|     * Hash#to_h now maps keys and values to new keys and values
 | |
|       by the block if given.  [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 options]
 | |
| 
 | |
|     * new mode character <code>'x'</code> to open files for exclusive
 | |
|       access. [Feature #11258]
 | |
| 
 | |
| [Kernel]
 | |
| 
 | |
|   [Aliased methods]
 | |
| 
 | |
|     * Kernel#then is a new alias for Kernel#yield_self. [Feature #14594]
 | |
| 
 | |
|   [New options]
 | |
| 
 | |
|     * Kernel#Complex, Kernel#Float, Kernel#Integer, and
 | |
|       Kernel#Rational take +:exception+ option to specify the way of
 | |
|       error handling.  [Feature #12732]
 | |
| 
 | |
|     * Kernel#system takes +: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]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * Module#method_defined?, Module#private_method_defined?, and
 | |
|       Module#protected_method_defined? now accept the second
 | |
|       parameter as optional. If it's +true+ (=default), checks ancestor
 | |
|       modules/classes, or checks only the class itself. [Feature #14944]
 | |
| 
 | |
| [NameError]
 | |
| 
 | |
|   [New options]
 | |
| 
 | |
|     * NameError.new accepts +:receiver+ option to set receiver in Ruby
 | |
|       code.  [Feature #14313]
 | |
| 
 | |
| [NilClass]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * NilClass#=~ is added for compatibility.  [Feature #15231]
 | |
| 
 | |
| [NoMethodError]
 | |
| 
 | |
|   [New options]
 | |
| 
 | |
|     * NoMethodError.new accepts +:receiver+ option to set receiver in Ruby
 | |
|       code.  [Feature #14313]
 | |
| 
 | |
| [Numeric]
 | |
| 
 | |
|   [Incompatible changes]
 | |
| 
 | |
|     * Numeric#step now returns an instance of Enumerator::ArithmeticSequence
 | |
|       class rather than one of Enumerator class.
 | |
| 
 | |
| [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 methods]
 | |
| 
 | |
|     * added Random.bytes.  [Feature #4938]
 | |
| 
 | |
| [Range]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * Added Range#% instance method.  [Feature #14697]
 | |
| 
 | |
|   [Incompatible changes]
 | |
| 
 | |
|     * Range#=== now uses +#cover?+ instead of +#include?+ method. [Feature #14575]
 | |
|     * Range#cover? now accepts Range object. [Feature #14473]
 | |
|     * Range#step now returns an instance of Enumerator::ArithmeticSequence
 | |
|       class rather than one of Enumerator class.
 | |
| 
 | |
| [RubyVM]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * RubyVM.resolve_feature_path identifies the file that will be loaded by
 | |
|       "require(feature)". [experimental] [Feature #15230]
 | |
| 
 | |
| [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]
 | |
| 
 | |
| [Regexp/String]
 | |
| 
 | |
|     * Update Unicode version from 10.0.0 to 11.0.0 [Feature #14802]
 | |
| 
 | |
|     * Update Emoji version from 5.0 to 11.0.0 [Feature #14802]
 | |
| 
 | |
| [String]
 | |
| 
 | |
|   * String#crypt is now deprecated. [Feature #14915]
 | |
| 
 | |
|   [New features]
 | |
| 
 | |
|     * String#split yields each substring to the block if given. [Feature #4780]
 | |
| 
 | |
| [Struct]
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|     * Struct#to_h now maps keys and values to new keys and values
 | |
|       by the block if given.  [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
 | |
|       UTC offset string. Time#+, Time#- and Time#succ also preserve
 | |
|       the timezone.  [Feature #14850]
 | |
| 
 | |
| [TracePoint]
 | |
| 
 | |
|   [New features]
 | |
| 
 | |
|     * "compiled_script" event is supported. [Feature #15287]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * TracePoint#parameters [Feature #14694]
 | |
| 
 | |
|     * TracePoint#compiled_instruction_sequence [Feature #15287]
 | |
| 
 | |
|     * TracePoint#compiled_eval_script [Feature #15287]
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|     * TracePoint#enable accepts new keywords "target:" and "target_line:".
 | |
|       [Feature #15289]
 | |
| 
 | |
| === Stdlib updates (outstanding ones only)
 | |
| 
 | |
| [Bundler]
 | |
| 
 | |
|   * Add Bundler to Standard Library. [Feature #12733]
 | |
| 
 | |
|   * Use 2.0.0. It's latest stable version.
 | |
| 
 | |
| [BigDecimal]
 | |
| 
 | |
|   Update to the version 1.4.0.  This version includes several compatibility
 | |
|   issues, see Compatibility issues section below for the detail.
 | |
| 
 | |
|   [Modified methods]
 | |
| 
 | |
|   * BigDecimal() accepts new keywords "exception:" likewise Float().
 | |
| 
 | |
| [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.
 | |
| 
 | |
| [ERB]
 | |
| 
 | |
|   [New options]
 | |
| 
 | |
|     * Add +:trim_mode+ and +:eoutvar+ keyword arguments to ERB.new.
 | |
|       Now non-keyword arguments other than 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, which will be removed
 | |
|       in the next version.
 | |
| 
 | |
| [FileUtils]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * FileUtils#cp_lr.  [Feature #4189]
 | |
| 
 | |
| [Matrix]
 | |
| 
 | |
|   [New methods]
 | |
| 
 | |
|     * Matrix#antisymmetric? / #skew_symmetric?
 | |
| 
 | |
|     * Matrix#map! / #collect! [Feature #14151]
 | |
| 
 | |
|     * Matrix#[]=
 | |
| 
 | |
|     * Vector#map! / #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]
 | |
| 
 | |
| [REXML]
 | |
| 
 | |
|   [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: Accept options as Hash. +:validate+ ,
 | |
|       +:ignore_unknown_element+ , +:parser_class+ options are available.
 | |
| 
 | |
| [RubyGems]
 | |
| 
 | |
|   * Upgrade RubyGems 3.0.0.beta3
 | |
| 
 | |
| [Set]
 | |
| 
 | |
|   [Aliased methods]
 | |
| 
 | |
|     * Set#filter! is a new alias for Set#select!.  [Feature #13784]
 | |
| 
 | |
| [URI]
 | |
| 
 | |
|   [New constant]
 | |
| 
 | |
|     * Add URI::File to handle 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.new
 | |
|     * BigDecimal.ver
 | |
| 
 | |
|   * Every BigDecimal object is frozen. [Feature #13984]
 | |
| 
 | |
|   * BigDecimal() parses the given string like Float().
 | |
| 
 | |
|   * String#to_d parses the receiver string like String#to_f.
 | |
| 
 | |
| === C API updates
 | |
| 
 | |
| === Supported platform changes
 | |
| 
 | |
| === 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 so many Proc#call 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 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 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 managed heap for short-living memory objects. For example,
 | |
|   making small and short-living Hash object is x2 faster. With rdoc benchmark,
 | |
|   we measured 6-7% performance improvement.
 | |
| 
 | |
| === 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
 | |
| 
 | |
| === Misc
 | |
| 
 | |
| * Extracted misc/*.el files to https://github.com/ruby/elisp
 |