# -*- rdoc -*-
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. https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
-
Multiple assignment in conditional expression is now allowed.
- Feature #10617
-
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.
-
-
Comparable
-
Comparable#clamp. [Feature #10594]
-
-
Dir
-
Dir.empty?. [Feature #10121]
-
-
Enumerable
-
Enumerable#sum [Feature #12217]
-
Enumerable#uniq [Feature #11090]
-
-
Enumerator::Lazy
-
Enumerator::Lazy#uniq [Feature #11090]
-
-
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]
-
-
Hash
-
Hash#transform_values and Hash#transform_values! [Feature #12512]
-
-
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]
-
Integer#digits for extracting columns of place-value notation [Feature #12447]
-
-
Kernel
-
Kernel#clone now takes an optional keyword argument, freeze flag.
- Feature #12300
-
-
MatchData
-
MatchData#named_captures [Feature #11999]
-
MatchData#values_at supports named captures [Feature #9179]
-
-
Module
-
Module.used_modules [Feature #7418]
-
-
Regexp
-
Regexp#match? [Feature #8110] This returns bool and doesn’t save backref.
-
-
Regexp/String: Updated Unicode version from 8.0.0 to 9.0.0 [Feature #12513]
-
RubyVM::Env
-
RubyVM::Env was removed.
-
-
String
-
String#upcase, String#downcase, String#capitalize, String#swapcase and their bang variants work for all of Unicode, and are no longer limited to ASCII. Supported encodings are UTF-8, UTF-16BE/LE, UTF-32BE/LE, and ISO-8859-1~16. Variations are available with options. See the documentation of String#downcase for details. [Feature #10085]
-
String.new(capacity: size) [Feature #12024]
-
-
Symbol
-
Symbol#match now returns MatchData. [Bug #11991]
-
Symbol#upcase, Symbol#downcase, Symbol#capitalize, and Symbol#swapcase now work for all of Unicode. See the documentation of String#downcase for details. [Feature #10085]
-
-
Thread
-
Thread#report_on_exception and Thread.report_on_exception
- Feature #6647
-
-
Warning
-
New module named Warning is introduced. By default it has only one singleton method, named warn. This makes it possible for 3rd-party libraries to control the way warnings are handled.
- Feature #12299
-
-
CGI
-
Don’t allow , as a separator [Bug #12791]
-
-
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]
-
OpenSSL
-
OpenSSL is extracted as a gem and the upstream has been migrated to github.com/ruby/openssl. OpenSSL still remains as a default gem. Refer to its History.md for the full release note. [Feature #9612]
-
-
Readline
-
Readline.quoting_detection_proc and Readline.quoting_detection_proc=
- Feature #12659
-
-
optparse
-
Add an into option. [Feature #11191]
-
-
WEBrick
-
Don’t allow , as a separator [Bug #12791]
-
-
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, Fixnum object and Bignum object should be distinguished by FIXNUM_P(obj) and RB_TYPE_P(obj, T_BIGNUM). RUBY_INTEGER_UNIFICATION can be used to detect this feature at C-level. 0.class == Integer can be used to detect this feature at Ruby-level. ruby-2.4.0-preview1 (temporally) removes rb_cFixnum and rb_cBignum to check the effect of incompatibility. (rb_cFixnum and rb_cBignum may be defined as rb_cInteger later if compilation failure of extension library is too big problem.)
-
String/Symbol#upcase/downcase/swapcase/capitalize(!) now work for all of Unicode, not only for ASCII. [Feature #10085] No change is needed if the data is in ASCII anyway or if the limitation to ASCII was only tolerated while waiting for a more extensive implementation. A change (using the :ascii option) is needed in cases where Unicode data is processed, but the operation has to be limited to ASCII only. A good example of this are internationalized domain names.
-
DateTime
-
DateTime#to_time now preserves timezone. [Bug #12189]
-
-
Time
-
Time#to_time now preserves timezone. [Bug #12271]
-
-
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.
-
-
Tk
-
Tk is removed from stdlib. [Feature #8539] github.com/ruby/tk is the new upstream.
-
-
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.
-
FreeBSD < 4 is no longer supported
-
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)`.
-
Thread deadlock detection now shows their backtrace and dependency. [Feature #8214]