このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
それぞれのエントリーは参照情報があるため短いです。十分な情報と共に書かれた全ての変更のリストは ChangeLog ファイルか bugs.ruby-lang.org の issue を参照してください。
2.4.0 以降の変更
言語仕様の変更
- トップレベルの定数参照を削除しました [feature#11547]
- do/end ブロック内部で rescue/else/ensure を書けるようになりました [feature#12906]
- 文字列の式展開内部の暗黙の to_s 呼び出しにも refinements が影響するようになりました [feature#13812]
組み込みクラスの更新
- Data
- 非推奨になりました。C拡張のベースクラスでしたが、Rubyレベルに公開するのをやめました。[feature#3072]
- Exception
- Exception#full_message を追加 [feature#14141] [実験的] 例外の文字列表現を取得します。その文字列は捕捉されない例外をRubyが表示しているのと同じ方法でフォーマットされます。
- Dir
- Dir.glob :base というキーワード引数を追加しました [feature#13056]
- Dir.chdir (ブロックなしで呼び出した場合), Dir.open, Dir.new, Dir.mkdir, Dir.rmdir, Dir.empty? はGVLを解放するようになりました
- Dir.children を追加 [feature#11302]
- Dir.each_child を追加 [feature#11302]
- Enumerable
- Enumerable#any?, Enumerable#all?, Enumerable#none?, Enumerable#one? がブロックを省略して1つの引数を受け取ることができるようになりました [feature#11286]
- File
- File.open :newline オプションを指定するとテキストモードになります [bug#13350]
- File#path はFile::Constants::TMPFILE付きで開いたファイルに対して IOError を発生させます [feature#13568]
- File.stat, File.exist? など rb_stat() を使用しているメソッドではGVLを解放するようになりました [bug#13941]
- File.rename GVL を解放するようになりました [feature#13951]
- File::Stat#atime, File::Stat#mtime, File::Stat#ctime Windows 8 以降でタイムスタンプの分数表現をサポートしました [feature#13726]
- File::Stat#ino, File.identical? Windows 8.1 以降で、ReFSの128bitのinoをサポートしました [feature#13731]
- File.readable?, File.readable_real?, File.writable?, File.writable_real?, File.executable?, File.executable_real?, File.mkfifo, File.readlink, File.truncate, File#truncate, File.chmod, File.lchmod, File.chown, File.lchown, File.unlink, File.utime, File.lstat はGVLを解放するようになりました
- File.lutime を追加 [feature#4052]
- IO
- IO.copy_stream は copy_file_range(2) を使うようになりました。また、その実装が使えない場合は他の実装へフォールバックするようにしました [feature#13867]
- IO#pread を追加 [feature#4532]
- IO#pwrite を追加 [feature#4532]
- IO#write 複数の引数を受け取れるようになりました [feature#9323]
- IOError
- IO#close 以前は"stream closed"というメッセージの例外が発生していましたが、"stream closed in another thread"というメッセージに改良しました。 このメッセージはユーザーにとってわかりやすいでしょう。 [bug#13405]
- Kernel
- Object#yield_self を追加 [feature#6721]
- Kernel.#pp をrequireなしで使えるようにしました [feature#14123]
- Kernel.#warn :uplevel というキーワード引数を追加しました [feature#12882]
- Method
- Method#=== は Proc#===と同じようにMethod#callを呼び出します [feature#14142]
- Module
- Module#attr, Module#attr_accessor, Module#attr_reader, Module#attr_writer はパブリックメソッドになりました [feature#14132]
- Module#define_method, Module#alias_method, Module#undef_method, Module#remove_method はパブリックメソッドになりました [feature#14133]
- Numeric
- Numeric#step は > で0と比較できない引数が与えられたときcoerce内部で発生したエラーを隠蔽しないようになりました。 [feature#7688]
- 数値の比較メソッド(<,<=,>=,>)は、coerceメソッドで発生した例外を隠蔽しなくなりました。 coerceがnilを返す場合、変換は不可能です。[feature#7688]
- Process
- getrusage(2) が存在する場合 Process.#times の精度を改良しました [feature#11952]
- Process.last_status を追加。$? と同じです [feature#14043]
- Range
- Range.new no longer hides exceptions when comparing begin and end with #<=> and raise a "bad value for range" ArgumentError but instead lets the exception from the #<=> call go through. [feature#7688]
- Regexp
- Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05 に更新
- 非包含オペレータ(absence operator)をサポート https://github.com/k-takata/Onigmo/issues/82
- Support new 5 emoji-related Unicode character properties
- Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05 に更新
- String
- String#-@ はフリーズされていない文字列の重複を排除します。 互換性のため、既にフリーズされている文字列には何もしません。 [feature#13077]
- -"literal" (String#-@) は同じオブジェクトを返すように最適化しました。 (Ruby 2.1以降の "literal".freeze と同じです) [feature#13295]
- String#casecmp, String#casecmp? に文字列でない引数を与えた場合、TypeErrorを発生させずにnilを返すようにしました [bug#13312]
- String#start_with? は正規表現を受け取れるようになりました [feature#13712]
- String#delete_prefix, String#delete_prefix! を追加 [feature#12694]
- String#delete_suffix, String#delete_suffix! を追加 [feature#13665]
- String#each_grapheme_cluster, String#grapheme_clusters を追加。結合文字を列挙します。 [feature#13780]
- String#undump を追加。String#dumpで出力した文字列を元に戻します。[feature#12275]
- Struct
- Struct.new は :keyword_init というキーワード引数を受け取り、メンバーをキーワード引数で初期化できるようになりました。 [feature#11925]
- Regexp/String: Unicodeのバージョンを 9.0.0 から 10.0.0 に更新しました。 [feature#13685]
- Thread
- Thread#name= で設定した名前が Windows 10 で見えるようになりました
- Thread#fetch を追加 [feature#13009]
- Thread.report_on_exception のデフォルト値がtrueになりました。 スレッドの終了時に捕捉していない例外の情報を $stderr に出力します。 [feature#14143]
- Time
- Time.at は第2引数の精度を指定するための第3引数を指定できるようになりました [feature#13919]
- FrozenError
- 新しい例外クラスです [feature#13224]
標準添付ライブラリの更新
- bigdecimal
- BigDecimal 1.3.4 に更新
- BigDecimal::VERSION を追加
- 非推奨(1.4.0で削除予定)
- BigDecimal.new
- BigDecimal.ver
- BigDecimal#clone と BigDecimal#dup は新しいインスタンスを作らなくなりました。selfを返します。
- coverage
- ブランチカバレッジとメソッドカバレッジの計測をサポートしました [feature#13901] この新機能と一緒にテストスイートを実行すると、テストによって実行された条件分岐やメソッドについて知ることができます。 テストスイートのカバレッジをより厳密に評価することができます。 Coverage.start に与えるオプションによって計測する対象を指定することができます。
Coverage.start(lines: true, branches: true, methods: true)
- Rubyで書かれたファイルをいくつか読み込んでから、Coverage.result を使って結果を取得することができます。
Coverage.result
#=> { "/path/to/file.rb"=>
# { :lines => [1, 2, 0, nil, ...],
# :branches =>
# { [:if, 0, 2, 1, 6, 4] =>
# { [:then, 1, 3, 2, 3, 8] => 0,
# [:else, 2, 5, 2, 5, 8] => 2
# }
# },
# :methods => {
# [Object, :foo, 1, 0, 7, 3] => 2
# }
# }
# }
- ラインカバレッジについての変更はありません。ラインカバレッジの結果はただの数値の配列です。 数値の入っている要素は実行された行を表し、その数値は実行回数を意味します。 nilの入った要素はカバレッジに関係のない行を意味します。
- ブランチカバレッジの結果はこのようになります:
{ (jump base) => { (jump target) => (counter) } }
- jump base と jump target にはフォーマットがあります:
[type, unique-id, start lineno, start column, end lineno, end column]
- 例えば [:if, 0, 2, 1, 6, 4] は、if式が2行目の1桁目から6行目の4桁目まで、と読みます。 [:then, 1, 3, 2, 3, 8] は、then節が3行目の2桁目から3行目の8桁目まで、と読みます。 なお、行番号は1から始まり、桁番号は0から始まります。 よって、上記の例ではifから最初のthen節は実行されておらず、else節は2回実行されています。
- メソッドカバレッジの場合:
{ (method key) => (counter) }
- メソッドキーにはフォーマットがあります:
[class, method-name, start lineno, start column, end lineno, end column]
- 例えば [Object, :foo, 1, 0, 7, 3] は Object#foo は1行目の0桁目から7行目の3桁目までで定義されている、と読みます。 上記の例では Object#foo は2回実行されています。
- Note: 互換性のため、Coverage.start にオプションを与えない場合は、ラインカバレッジのみを計測します。 また Coverage.result も旧フォーマットを返します。
Coverage.result
#=> { "/path/to/file.rb"=> [1, 2, 0, nil, ...] }
- drb
- ACL::ACLEntry.new は IPAddr::InvalidPrefixError を抑制しなくなりました
- erb
- ERB#result_with_hash を追加。 ハッシュで与えられたローカル変数とともにテンプレートを描画します。[feature#8631]
- erbコマンドのテンプレートファイルのエンコーディングのデフォルトは、ASCII-8BITからUTF-8に変更されました。 [bug#14095]
- トリムモードが指定されているときキャリッジリターンを正しくトリムするようにしました。 Windowsで重複した改行を削除するようになりました。[bug#5339] [bug#11464]
- ipaddr
- IPAddr は不正なアドレスマスクを受けいれないようになりました [bug#13399]
- IPAddr#ipv4_compat, IPAddr#ipv4_compat? は非推奨になりました [bug#13769]
- IPAddr#prefix を追加
- IPAddr#loopback? を追加
- IPAddr#private? を追加 [feature#11666]
- IPAddr#link_local? を追加 [feature#10912]
- irb
- バックトレースとエラーメッセージを逆順で表示するようにしました [feature#8661] [実験的]
- binding.irb を実行したときに自動的に irb を読み込みます [bug#13099] [実験的]
- binding.irb を実行したときに周囲のソースコードを表示します [feature#14124]
- net/http
- Net::HTTP.new が no_proxy パラメータをサポートしました [feature#11195]
- Net::HTTP#min_version Net::HTTP#max_version を追加 [feature#9450]
- HTTP status を表すクラスをいくつか追加しました
- Net::HTTP::STATUS_CODES を追加。HTTPのステータスコードから文字列表現へのハッシュです。 [misc#12935]
- Net::HTTP#proxy_user, Net::HTTP#proxy_pass は 環境変数 http_proxy を反映するようになりました。 ただし、システムの環境変数がマルチユーザーセーフである場合のみ。[bug#12921]
- openssl
- Ruby/OpenSSLのバージョンを2.0から2.1に更新しました。変更内容はext/openssl/History.mdの"Version 2.1.0"セクションにあります。
- psych
- Psych 3.0.2 に更新しました
- Convert fallback option to a keyword argument https://github.com/ruby/psych/pull/342
- Add :symbolize_names option to Psych.load, Psych.safe_load like JSON.parse https://github.com/ruby/psych/pull/333, https://github.com/ruby/psych/pull/337
- Add Psych::Handler#event_location https://github.com/ruby/psych/pull/326
- Make frozen string literal = true https://github.com/ruby/psych/pull/320
- Preserve time zone offset when deserializing times https://github.com/ruby/psych/pull/316
- Remove deprecated method aliases for syck gem https://github.com/ruby/psych/pull/312
- Psych 3.0.2 に更新しました
- rbconfig
- RbConfig::LIMITS is added to provide the limits of C types. This is available when rbconfig/sizeof is loaded.
- ripper
- Ripper::EXPR_BEG and so on for Ripper#state.
- Ripper#state を追加。スキャナーの状態を伝えるためです。[feature#13686]
- rdoc
- RDoc 6.0.1 に更新
- Replace IRB based lexer with Ripper.
- https://github.com/ruby/rdoc/pull/512
- This much improves the speed of generating documents.
- It also facilitates supporting new syntax in the future.
- Support many new syntaxes of Ruby from the past few years.
- Use "frozen_string_literal: true". This reduces document generation time by 5%.
- Support did_you_mean.
- Replace IRB based lexer with Ripper.
- RDoc 6.0.1 に更新
- rubygems
- Rubygems 2.7.3 に更新
- https://blog.rubygems.org/2017/11/28/2.7.3-released.html
- https://blog.rubygems.org/2017/11/08/2.7.2-released.html
- https://blog.rubygems.org/2017/11/03/2.7.1-released.html
- https://blog.rubygems.org/2017/11/01/2.7.0-released.html
- https://blog.rubygems.org/2017/10/09/2.6.14-released.html
- https://blog.rubygems.org/2017/08/27/2.6.13-released.html
- Rubygems 2.7.3 に更新
- set
- Set#to_s を Set#inspect の別名として追加 [feature#13676]
- Set#=== を Set#include? の別名として追加 [feature#13801]
- Set#reset [feature#6589]
- stringio
- StringIO#write は複数の引数を受け取れるようになりました
- uri
- Relative path operations no longer collapse consecutive slashes to a single slash. [bug#8352]
- webrick
- Server Name Indication (SNI) サポートを追加 [feature#13729]
- WEBrick::HTTPResponse#send_body_proc を追加 [feature#855]
- RubyGem としてリリース [feature#13173]
- 意図しない振舞いを避けるため Kernel.#open を使用するのをやめました [misc#14216]
- zlib
- Zlib::GzipWriter#write は複数の引数を受け取れるようになりました
互換性 (機能追加とバグ修正以外)
- BasicSocket
- BasicSocket#read_nonblock と BasicSocket#write_nonblock で 副作用として O_NONBLOCK フラグをセットするのをやめました(Linux のみ) [feature#13362]
- Random
- Random.raw_seed は Random.urandom に名前を変更しました。 シードを必要としない用途で有用です。[bug#9569]
- ConditionVariable, Queue, SizedQueue を速度向上のため再実装しました。 これらのクラスはStructのサブクラスではなくなりました。[feature#13552]
標準添付ライブラリの互換性(機能追加とバグ修正を除く)
- Gemification
- 以下の標準添付ライブラリをdefault gemsに変更しました
- cmath
- csv
- date
- dbm
- etc
- fcntl
- fiddle
- fileutils
- gdbm
- ipaddr
- scanf
- sdbm
- stringio
- strscan
- webrick
- zlib
- 以下の標準添付ライブラリをdefault gemsに変更しました
- Logger
- Logger.new("| command") は意図せず、コマンドを実行していましたが、禁止されました。 Logger#initialize の引数は仕様としてファイル名としてのみ扱うようになりました。 [bug#14212]
- Net::HTTP
- Net::HTTP#start の第3引数のデフォルト値を :ENV にしました。 [bug#13351] これを避けるには明示的に nil を与えてください。
- mathn.rb
- 標準添付ライブラリから削除しました [feature#10169]
- Rubygems
- "ubygems.rb" というファイルを標準添付ライブラリから削除しました。Ruby 1.9 から不要でした。
C APIの更新
Supported platform の変更
実装の改善
- (これは「ユーザーに見える機能の変更」ではないが) Hashクラスのhashメソッドのアルゴリズムを SipHash13 にしました [feature#13017]
- SecureRandom が OpenSSL の提供する乱数ソースよりもOSの提供する乱数ソースを優先するようにしました [bug#9569]
- Mutex をより小さくより速く書き直しました [feature#13517]
- lazy Proc allocation というテクニックでブロックをメソッドの引数として渡したときの性能が向上しました [feature#14045]
- TracePointのためにtrace命令の変わりに命令の動的書き換えを使用するようにしました [feature#14104]
- ERB がテンプレートから生成するコードはRuby 2.4 よりも2倍速くなりました
その他の変更
- $stderrが変更されておらず出力先がttyの場合、バックトレースとエラーの表示される順序を逆順にしました。 [feature#14140] [実験的]
- $stderrが変更されておらず出力先がttyの場合、エラーメッセージを太字と下線で装飾するようにしました。 [feature#14140] [実験的]
- configure オプション --with-ext はその引数を強制できるようになりました。 例えば ./configure --with-ext=openssl,+ を実行すると、openssl は必ずビルドされた状態になることが保証されます。 その他の拡張ライブラリは、デフォルトの挙動となります。もし、opensslのビルドに失敗した場合は、全体のビルドが失敗します。 もし ",+" を末尾に付けない場合は、openssl 以外はビルドされません。[feature#13302]