NEWS for Ruby 2.4.0
このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
それぞれのエントリーは参照情報があるため短いです。十分な情報と共に書かれた全ての変更のリストは ChangeLog ファイルか bugs.ruby-lang.org の issue を参照してください。
2.3.0 以降の変更
言語仕様の変更
組み込みクラスの更新
- Process
- macOS 10.12 から導入された CLOCK_MONOTONIC_RAW_APPROX, CLOCK_UPTIME_RAW,
CLOCK_UPTIME_RAW_APPROX をサポートしました
- Regexp
- meta character \X matches Unicode 9.0 characters with some workarounds
for UTR #51 Unicode Emoji, Version 4.0 emoji zwj sequences.
- Regexp#match? を追加 [feature#8110]
true/false を返し、バックリファレンスを生成しません。
- Onigmo 6.0.0 に更新 (Ruby 2.4.0)
- Onigmo 6.1.1 に更新 (Ruby 2.4.1)
- String
- String#casecmp? を追加 [feature#12786]
- String#concat, String#prepend 複数の引数を受け付けるようになりました [feature#12333]
- String#each_line, String#lines 省略可能なキーワード引数 chomp を受け付けるようになりました [feature#12553]
- String#match? を追加 [feature#12898]
- String#unpack1 を追加 [feature#12752]
- String#upcase, String#downcase, String#capitalize, String#swapcase,
String#upcase!, String#downcase!, String#capitalize!, String#swapcase!
は全てのUnicodeに対して動作するようになりました。もはやASCIIのみに限定されていません。
UTF-8, UTF-16BE/LE, UTF-32BE/LE, ISO-8859-1~16 をサポートしています。
Variations are available with options. [feature#10085]
- String.new(capacity: size) [feature#12024]
標準添付ライブラリの更新 (優れたもののみ)
- rexml
- REXML::Element#[]: If String or Symbol is specified, attribute
value is returned. Otherwise, Nth child is returned. This is
backward compatible change.
互換性 (機能追加とバグ修正を除く)
- Array#sum と Enumerable#sum を追加しました。 [feature#12217]
Ruby2.4以前ではArray#sumはなかったのでRuby自身には互換性の問題はありません。
しかし、多くのサードパーティ製のGem(activesupport, facets, simple_stats, etc)で
sumメソッドを定義しています。それらの実装はほとんど互換ですが、微妙な違いがあります。
Rubyのsumメソッドは概ね互換であるべきですが、全てのサードパーティ製の実装と完全に互換性を保つことは不可能です。
- FixnumとBignumはIntegerに統合されました。[feature#12005]
FixnumクラスとBignumクラスは削除されました。
Integerクラスは抽象クラスから具象クラスに変更されました。
Cレベルの定数 rb_cFixnumとrb_cBignumは削除されました。これらを使用している場合、
コンパイルエラーになります。
# 0のクラスはInteger
0.class # => Integer
Fixnum # => Integer
Bignum # => Integer
# 以下の2つは同じ
obj.kind_of?(Fixnum)
obj.kind_of?(Integer)
/* Cレベルでは以下の2つを使ってFixnumとBignumを区別すべき */
FIXNUM_P(obj)
RB_TYPE_P(obj, T_BIGNUM)
/* Cレベルではこの機能を検出するために以下の定数を使います */
RUBY_INTEGER_UNIFICATION
# Rubyレベルでは以下のコードでこの機能を検出できます
0.class == Integer
- String/Symbol#upcase/downcase/swapcase/capitalize(!) はASCIIだけでなく全てのUnicodeに対して動作するようになりました。[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.
:asciiオプションを使うようにする変更が必要なのは、Unicodeのデータを処理するときに、
ASCIIのみ変換したい場合です。国際化ドメイン名の処理はよい例です。
- TRUE / FALSE / NIL
これらは廃止されました。[feature#12574]
true / false / nil を使用してください。
標準添付ライブラリの互換性(機能追加とバグ修正を除く)
- 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 の更新
- 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.
- rb_gc_adjust_memory_usage() [Feature #12690]
サポートするプラットフォームの変更
- FreeBSD < 4 はもうサポートしていません
実装の改善
- いくつかの条件で [x,y].max と [x,y].min が一時的な配列を生成しないよう最適化されました。
Math.max(x, y) と書くようなほとんどのカジュアルで実際にありそうなユースケースで効果があります。
具体的な条件は実装の詳細ですが以下の通りです:
- 配列リテラルに splat が含まれないこと
- must have at least one expression but literal
- 配列の長さが0x100(256)以下であること
- Array#max や Array#min が再定義されていないこと
その他の変更