このドキュメントは前回リリース以降のバグ修正を除くユーザーに影響のある機能の変更のリストです。
それぞれのエントリーは参照情報があるため短いです。十分な情報と共に書かれた全ての変更のリストは ChangeLog ファイルか bugs.ruby-lang.org の issue を参照してください。
2.2.0 以降の変更
言語仕様の変更
- frozen-string-literal プラグマ:
- 実験的な機能として fronzen-string-literal というプラグマが導入されました。 [feature#8976]
- さらに --enable/--disable=frozen-string-literal というコマンドラインオプションも導入されました [feature#8976]
- コマンドラインオプションに --debug または --debug=frozen-string-literal を付けて実行すると、 freeze された文字列を操作しようとして RuntimeError が発生したときにそのオブジェクトが生成された位置を表示します。 [feature#11725]
- safe navigation operator (ぼっち演算子):
- object&.foo という形式のメソッド呼び出し形式が追加されました。これは object が nil でないときにメソッド foo を呼び出します。 Active Support の try! と似ていますが、メソッド名は文法的に必須であるという点が異なります。 [feature#11537]
obj.try! {} # valid obj&. {} # syntax error
- 引数はメソッドが呼び出された場合のみ評価されます。
obj.try!(:foo, bar()) # bar() は常に評価されます obj&.foo(bar()) # bar() は条件付きで評価されます
- 属性値の代入にも使えます
obj&.attr += 1
- did_you_mean gem:
- 名前のタイポによって NameError や NoMethodError が起きたときに、自動的に他の似た名前を提案してくれます。
"Yuki".starts_with?("Y") # => NoMethodError: undefined method `starts_with?' for "Yuki":String # Did you mean? start_with?
- インデントされたヒアドキュメント:
- 新しい文字列リテラルとして <<~ で始まるヒアドキュメントが追加されました [feature#9098]
組み込みクラスの更新
- ARGF
- ARGF.read_nonblock は IO#read_nonblock と同じように `exception: false' オプションをサポートします [feature#11358]
- Comparable
- Comparable#==はもはや例外を rescue しません [feature#7688]
- Encoding
- Encoding::IBM037 (alias ebcdic-cp-us; dummy) を追加
- File
- File.mkfifo [feature#11536]
- O_TMPFILE に対応する File::TMPFILE(File::Constants::TMPFILE) を追加
- IO
- 新しいフラグ File::SHARE_DELETE(File::Constants::SHARE_DELETE) が使用できます。 Windows で開いているファイルを削除することを許可しますが、現在はファイルをバイナリモードで開いているときのみ効果があります。 [feature#11218]
- `flags` オプションの追加。 this parameter is bitwise-ORed to oflags generated by normal mode argument. [feature#11253]
- IO#advise はもはや Errno::ENOSYS を起こしません。 サポートの有無を実行時ではなくビルド時に検出するためです。 [feature#11806]
- Kernel
- Kernel.#loop は StopIteration で停止したときに nil ではなく最後に評価した要素を返します。 [feature#11498]
- NameError
- レシーバーオブジェクトを返す NameError#receiver を追加 [feature#10881]
- Proc
- Proc#call ( Proc#[], Proc#===, Proc#yield) は最適化されました。 Backtrace doesn't show each method (show block lines directly). TracePoint also ignores these calls. [feature#11569]
- Queue (Thread::Queue)
- 終了を通知するために Queue#close(Thread::Queue#close) を追加 [feature#10600]
- RubyVM::InstructionSequence
- 実験的な機能としてiseqローダー用の低レベルな操作をするメソッドをいくつか追加
使用例は sample/iseq_loader.rb を見てください。
ローダーには検証機能がないので、編集したバイナリや壊れたバイナリをロードすると簡単に致命的な問題を起こすことができます。
[feature#11788]
- RubyVM::InstructionSequence#to_binary(extra_data = nil)
- RubyVM::InstructionSequence.load_from_binary(binary)
- RubyVM::InstructionSequence.load_from_binary_extra_data(binary)
- 実験的な機能としてiseqローダー用の低レベルな操作をするメソッドをいくつか追加
使用例は sample/iseq_loader.rb を見てください。
ローダーには検証機能がないので、編集したバイナリや壊れたバイナリをロードすると簡単に致命的な問題を起こすことができます。
[feature#11788]
- String
- フリーズされていない文字列を生成するString#+@ を追加
- フリーズされた文字列を生成する String#-@ を追加 [feature#11782]
- String.new に `encoding` オプションが追加されました [feature#11785]
- Thread
- スレッド名を扱うために Thread#name, Thread#name= を追加 [feature#11251]
組み込みクラスの互換性 (機能追加とバグ修正を除く)
- Array
- Array#select!, Array#keep_if, Array#reject!, Array#delete_if ブロックが評価される度にレシーバーの配列をすぐに変更しないようになりました。 [feature#10714]
- Array#flatten と Array#flatten! は与えられたレベルを越えた要素には `#to_ary`を呼ばないようになりました。 [bug#10748]
- Array#inspect はその要素の文字列が Encoding.default_external と 互換性のないエンコーディングであっても例外が発生しなくなりました。 [feature#11801]
- Enumerable
- Enumerable#chunk と Enumerable#slice_before は初期状態を引数として受け取らなくなりました。 状態の管理にはローカル変数を使ってください。 [feature#10958]
- File::Stat
- Windows では File::Stat#ino は常に 0 を返していましたが、 BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low を返すようになりました。 [feature#11216]
- Hash
- Hash#inspect はその要素の文字列が Encoding.default_external と 互換性のないエンコーディングであっても例外が発生しなくなりました。 [feature#11801]
- IO
- クローズ済みのIOオブジェクトに IO#close を呼んでも例外が発生しなくなりました。 [feature#10718]
- IO#each_codepoint は、変換時、EOFの前に不完全な文字があると例外が発生するようになりました。 [bug#11444]
- Module
- Module#define_method と Object#define_singleton_method は メソッド本体(Procオブジェクト、Methodオブジェクト、またはブロック )が必須になりました。 ブロックが与えられない場合は ArgumentError が発生します。 [bug#11283]
- pack/unpack (Array/String)
- `j`と`J`が追加されました。 [feature#11215]
標準添付ライブラリの更新 (優れたもののみ)
- Logger
- Logger#level= はシンボルと文字列でログレベルを指定できるようになりました。(大文字・小文字を区別しません) [feature#11695]
- ログデバイスを開きなおすために Logger#reopen が追加されました。 [feature#11696]
- io/wait
- IO#wait_readable は FIONREAD をチェックしなくなりました。 ソケットのようなバイトストリームではないIOで使われます。
- Net::FTP
- Net::FTP#mlst を追加。
- Net::FTP#mlsd を追加。
- nkf
- nkf 2.1.4 をマージしました。
- OpenSSL
- OpenSSL::SSL::SSLSocket#accept_nonblock と OpenSSL::SSL::SSLSocket#connect_nonblock は `exception: false` オプションをサポートするようになりました。 [feature#10532]
- Pathname
- Pathname#descend と Pathname#ascend はブロックなしでの呼び出しができるようになりました。 [feature#11052]
- Socket
- Socket#connect_nonblock, Socket#accept_nonblock, TCPServer#accept_nonblock, UNIXServer#accept_nonblock, BasicSocket#recv_nonblock, BasicSocket#recvmsg_nonblock, BasicSocket#sendmsg_nonblock に `exception: false` オプションを追加しました。 例外 IO::WaitReadable や IO::WaitWritable を発生させるかわりに :wait_readable, :wait_writable を返すためです。 [feature#10532] [feature#11229]
- BasicSocket#recv と BasicSocket#recv_nonblock は GC のオーバーヘッドを減らすために IO#read や IO#read_nonblock と同じように出力用の文字列を引数として受けとれるようになりました。 [feature#11242]
- StringIO
- リードオンリーモードでは、StringIO#set_encoding はそのバッファ文字列にエンコーディングをセットしないようになりました。 StringIO#set_encoding を使わずに文字列のエンコーディングを設定すると予期しない動作の原因となるかもしれません。 [bug#11827]
- timeout
- Object#timeoutは呼び出すと非推奨として警告されるようになりました。
標準添付ライブラリの互換性 (機能追加とバグ修正を除く)
- ext/coverage/coverage.c
- Coverage.peek_result を追加。カバレッジツールを停止することなくカバレッジに関する情報を取得することができます。 https://bugs.ruby-lang.org/issues/10816
- Fiddle
- Fiddle::Function#call は GVL を解放するようになりました。 [feature#11607]
- io/console
- io-console 0.4.5になりました。 ライセンスが BSD 2-clause "Simplified" License に変更されました。
- base64
- Base64.#urlsafe_encode64 に パディング文字("=")を抑制するために "padding" オプションが追加されました。 [feature#10740]
- Base64.#urlsafe_decode64: パディングされていない入力だけでなく正しくパディングされた入力も受け付けるようになりました。 [feature#10740]
- drb
- 使用していない引数を削除しました。 https://github.com/ruby/ruby/pull/515
- webrick/utils
- 使用していない引数を削除しました。 https://github.com/ruby/ruby/pull/356
- Net::FTP
- パッシブモードでの接続がデフォルトになりました。 Net::FTP.default_passive= で変更することができます。 [feature#11612]
- Net::HTTP
- Net::HTTP#open_timeout のデフォルト値が 60 になりました。(以前は nil でした)
- Net::Telnet
- Net::Telnet は net-telnet gem になりました。 [feature#11083]
- psych
- Psych 2.0.17 に更新しました。
- Rake
- Rake は標準添付ライブラリから削除されて bundled gem になりました。 [feature#11025]
- RDoc
- RDoc 4.2.1 に更新しました。
- RubyGems
組込みのグローバル変数の互換性に影響のある変更
- $SAFE
- $SAFE=2 と $SAFE=3 が廃止されました。$SAFE を2以上にすると ArgumentError が発生します。 [feature#5455]
C API の更新
- rb_define_class_id_under() は既にクラスが定義済みなのに、 そのスーパークラスが与えられたスーパークラスと一致しないとき Rubyレベルの定義と同じように TypeError を発生させるようになりました。
- 現在日時を timespec 構造体として取得する rb_timespec_now() が追加されました。 [feature#11558]
- 起算時からの経過秒数、ナノ秒、UTCからの時差から Time オブジェクトを 生成する rb_time_timespec_new() が追加されました。 [feature#11558]
- rb_autoload() は非推奨になりました。rb_funcall() を使ってください。 [feature#11664]
- rb_compile_error_with_enc(), rb_compile_error(), rb_compile_bug() が非推奨になりました。 これらの関数は公開されていますが、内部利用のためなので外部のライブラリでは使用するべきではありません。
サポートしているプラットフォームの変更
- OS/2 はもうサポートされていません。
- BeOS はもうサポートされていません。
- Borland-C はもうサポートされていません。
- Haiku は安定しています。ベストエフォートです。
実装の改善
- Proc#call をメソッドフレームの構築を取り除いて最適化しました。 [feature#11569]
- メソッドエントリのデータ構造を再考しました。 [bug#11278]
- メソッドテーブルなどに使用する新しいテーブルデータ構造を導入しました。 新しいテーブル構造は st_table よりもシンプルで速いです。 [feature#11420]
- オブジェクトアロケーションとメソッド呼び出しのために機械語レベルのチューニングをしました。 r52099, r52254
- 将来の改善のために RubyVM::InstructionSequence が拡張されました。 [feature#11788]
- nil, true, false の case 式のディスパッチが最適化されました。 以前は文字列、シンボル、整数、浮動小数のみが最適化されていました。 [feature#11769]
- ピュアRubyではないクラス(T_DATA, T_FILE など)上のインスタンス変数は以前よりも保存にコストがかからなくなりました。 [feature#11170]
- 巨大な Struct のオブジェクトのメンバーへのアクセスが定数時間になりました。 以前は、最初の10要素を越えると線形にスキャンしていました。 [feature#10585]
- Set の速度は向上しました。 [feature#10754] [r52591]
- Socket と I/O関連の改善
- [feature#11229] でI/Oのメソッドに導入された新しいキーワード引数によるオーバーヘッドは [feature#11339] でC APIでの非効率なキーワード引数のパースを避けることによって削減されました。
- 改善された例外なしのノンブロッキングI/Oによって標準添付ライブラリが更新されました。 [feature#11229] これによって、コストのかかる例外が減ったのでデバッグモード時のアウトプットが少なくなりました。 [feature#11044]
- (Linuxのみ) 標準添付ライブラリ内で、一つのFDをselect(2)で待つ箇所がなくなりました。 大きい番号のFDで遅くなり辛くなりました。 [feature#11081] [feature#11377]
- CGI.escapeHTML はC拡張で最適化されました。 https://github.com/ruby/ruby/pull/1164