ruby/NEWS

148 строки
4.3 KiB
Plaintext

# -*- rdoc -*-
= NEWS for Ruby 2.4.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.3.0 release
=== Language changes
* Multiple assignment in conditional expression is now allowed.
[Feature #10617]
=== Core classes updates (outstanding ones only)
* Array
* Array#max and Array#min. [Feature #12172]
This may cause a tiny incompatibility: if you redefine
Enumerable#max and call max to an Array, your redefinition will be
now ignored. You should also redefine Array#max.
* Array#sum [Feature #12217]
This is different from Enumerable#sum in that Array#sum doesn't depend on
the definition of each method.
* Dir
* Dir.empty?. [Feature #10121]
* Enumerable
* Enumerable#sum [Feature #12217]
* File
* File.empty?. [Feature #9969]
* Float
* Float#ceil, Float#floor, and Float#truncate now take an optional
digits, as well as Float#round. [Feature #12245]
* Integer
* Integer#ceil, Integer#floor, and Integer#truncate now take an optional
digits, as well as Integer#round. [Feature #12245]
* Fixnum and Bignum are unified into Integer [Feature #12005]
* Regexp
* Regexp#match? [Feature #8110]
This returns bool and doesn't save backref.
* String
* String.new(capacity: size) [Feature #12024]
* Symbol
* Symbol#match now returns MatchData. [Bug #11991]
* MatchData
* MatchData#named_captures [Feature #11999]
* MatchData#values_at supports named captures [Feature #9179]
=== Stdlib updates (outstanding ones only)
* CSV
* Add a liberal_parsing option. [Feature #11839]
* Logger
* Allow specifying logger parameters in constructor such
as level, progname, datetime_format, formatter. [Feature #12224]
* Add shift_period_suffix option. [Feature #10772]
* optparse
* Add an into option. [Feature #11191]
=== Compatibility issues (excluding feature bug fixes)
* Array#sum and Enumerable#sum are implemented. [Feature #12217]
Ruby itself has no compatibility problem because Ruby didn't have sum method
for arrays before Ruby 2.4.
However many third party gems, activesupport, facets, simple_stats, etc,
defines sum method. These implementations are mostly compatible but
there are subtle differences.
Ruby's sum method should be mostly compatible but it is impossible to
be perfectly compatible with all of them.
* Fixnum and Bignum are unified into Integer [Feature #12005]
Fixnum class and Bignum class is removed.
Integer class is changed from abstract class to concrete class.
For example, 0 is an instance of Integer: 0.class returns Integer.
The constants Fixnum and Bignum is bound to Integer.
So obj.kind_of?(Fixnum) works as obj.kind_of?(Integer).
At C-level, rb_cFixnum and rb_cBignum is same as rb_cInteger.
So, class based dispatch, such as klass == rb_cFixnum and
klass == rb_cBignum, should be changed to FIXNUM_P(obj) and
RB_TYPE_P(obj, T_BIGNUM).
=== Stdlib compatibility issues (excluding feature bug fixes)
* Time
* Time#to_time now preserves timezone. [Bug #12271]
* DateTime
* DateTime#to_time now preserves timezone. [Bug #12189]
* thread
* the extension library is removed. Till 2.0 it was a pure ruby script
"thread.rb", which has precedence over "thread.so", and has been provided
in $LOADED_FEATURES since 2.1.
=== C API updates
* ruby_show_version() will no longer exits the process, if
RUBY_SHOW_COPYRIGHT_TO_DIE is set to 0. This will be the default in
the future.
=== Supported platform changes
* FreeBSD < 4 is no longer supported
=== Implementation improvements
* In some condition, `[x, y].max` and `[x, y].min` are optimized
so that a temporal array is not created. The concrete condition is
an implementation detail: currently, the array literal must have no
splat, must have at least one expression but literal, the length must
be <= 0x100, and Array#max and min must not be redefined. It will work
in most casual and real-life use case where it is written with intent
to `Math.max(x, y)`.