Ruby 2.5.0リリースおめでとうございます。
Link: Ruby 2.5.0 Released https://t.co/AqzuAcuGTm
— Yukihiro Matsumoto (@yukihiro_matz) December 25, 2017
取り急ぎNEWSを斜め読みしてみました。誤りを含んでいるかもしれないので気づき次第修正します。
主要な変更点についてはCRubyコミッタの村田さんによる記事「Ruby 2.5.0 リリース直前!何が変わるのかもう一度おさらいしておこう!」で詳しく解説されています。NEWSには載っていませんが、以下の記事で解説されているNODEとGCの切り離しも大きな変更だと思います。
Link: Ruby の NODE を GC から卒業させた - クックパッド開発者ブログ: https://t.co/r9QC3CdJAK
— Yukihiro Matsumoto (@yukihiro_matz) December 25, 2017
2.4.0リリース以降の変更点
言語面の変更
- トップレベルの定数参照を削除(Feature #11547)
-
do
/end
ブロック内でrescue
/else
/ensure
を利用できるようになった(Feature #12906) -
文字列の式展開にrefinementsが効くようになった(Feature #13812)
コアクラスの変更点(主なもののみ)
Array
- 新メソッド
Array#append
(Feature #12746)Array#prepend
(Feature #12746)
Data
- 非推奨化: C拡張の基本クラスであり、Rubyレベルに公開する必要がないため(Feature #3072)
Exception
- 新メソッド:
Exception#full_message
で例外のString表現を取り出せるようになった: キャッチされていない例外をRubyが出力するときと同じフォーマットが使われる(Feature #14141 -- experimental)
Dir
Dir.glob
に新しいオプションキーワード引数:base
を追加 (Feature #13056)- 次のメソッドでGVLが解放されるようになった:
Dir.chdir
(ブロック引数なしの場合)、Dir.open
、Dir.new
、Dir.mkdir
、Dir.rmdir
、Dir.empty?
- 新メソッド:
Dir.children
(Feature #11302)Dir.each_child
(Feature #11302)
Enumerable
- 以下のメソッドで引数に正規表現パターンを直接与えられるようになった (Feature #11286)
Enumerable#any?
Enumerable#all?
Enumerable#none?
Enumerable#one?
追記: 以下も渡せるようです。
#===
に渡せるものならいけそうです。
[1, 2, 3].any?(1) # => true
[1, 2, 3].any?(Numeric) # => true
File
File.open
に:newline
オプションを与えると暗黙でテキストモードになるようになった(bug #13350)File::Constants::TMPFILE
オプション付きで開いたファイルがFile#path
でIOError
がraiseされるようになった(Feature #13568)- GVL(Giant VM Lock)が
File.stat
、File.exist?
およびrb_stat()
を使うその他のメソッドで解放されるようになった(bug #13941) File.rename
でGVLが解放されるようになった(Feature #13951)- 以下のメソッドで秒より細かいタイムスタンプをWindows 8以降でサポート(Feature #13726)
File::Stat#atime
File::Stat#mtime
File::Stat#ctime
File::Stat#ino
とFile.indentical?
でWindows 8.1以降のReFS 128bit inoをサポート(Feature #13731)- 以下のメソッドでGVLが解放されるようになった
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
- 新メソッド:
File.lutime
(Feature #4052)
Hash
- 新メソッド
Hash#transform_keys
(Feature #13583)Hash#transform_keys!
(Feature #13583)Hash#slice
(Feature #8499)
IO
IO#copy_stream
がcopy_file_range(2)でオフロードコピーを試行するようになった(Feature #13867)IO#write
が引数を複数取れるようになった(Feature #9323)- 新メソッド
IO#pread
(Feature #4532)IO#pwrite
(Feature #4532)
IOError
IO#close
が例外をraiseする場合のメッセージを「stream closd」から「stream closed in another thread」に改良した(bug #13405)
Integer
Integer#step
でstep値が#>
で0
と比較できない場合に#coerce
メソッドからのエラーを隠蔽しなくなった(Feature #7688)Integer#round
、Integer#round
、Integer#floor
、Integer#ceil
、Integer#truncate
が常にInteger
を返すようになった(bug #13420)Integer#pow
が指数算出用の剰余(modulo)を引数に取れるようになった(Feature #12508)(Feature #11003)- 新メソッド
Integer#allbits?
、Integer#anybits?
、Integer#nobits?
(Feature #12753)Integer.sqrt
(Feature #13219)
Kernel
Kernel#yield_self
(Feature #6721)Kernel#pp
(Feature #14123)Kernel#warn
(…, uplevel:n) (Feature #12882)
Method
- 新メソッド:
Method#===
(Proc#===
と同様Method#call
を呼ぶ)(Feature #14142)
Module
Module#attr
、Module#attr_accessor
、Module#attr_reader
、Moduleattr_writer
がpublicになった(Feature #14132)Module#define_method
、Module#alias_method
、Module#undef_method
、Module#remove_method
がpublicになった(Feature #14133)
Numeric
- 数値比較演算子(
<
、<=
、>=
、>
)が内部で#coerce
メソッドからの例外を隠蔽しないようになった: coertionが不可能な場合は#coerce
でnil
を返す(Feature #7688)
Process
getrusage(2)
が存在する場合のProcess.times
の精度を改善(Feature #11952)- 新メソッド:
Process.last_status
($?
のエイリアス)(Feature #14043)
Range
Range#initialize
で開始値と終了値の#<=>
の比較で“bad value for range” ArgumentErrorがraiseされた場合に例外を隠蔽しないようになった: 今後は#<=>
呼び出しからの例外をそのまま通す(Feature #7688)
Regexp
- Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05にアップデート
- 非包含演算子(absence operator)をサポート(#82)
- Unicodeの絵文字関連の文字プロパティを新たに5つサポート
RubyVM::InstructionSequence
- 新メソッド:
RubyVM::InstructionSequence#each_child
RubyVM::InstructionSequence#trace_points
String
- unfreezeされた文字列が
String#-@
でdupされないようになった: 既にfrozenされた文字列については互換性のため動作は変更されない(Feature #13077) -
-“リテラル”(
String#-@
)が同じオブジェクトを返すよう最適化された(ruby 2.1以降の"リテラル".freeze
と同じ)(Feature #13295) String#casecmp
/String#casecmp?
は引数が文字列でない場合にTypeError
をraiseする代わりにnil
を返すようになった(bug #13312)String#start_with?
で正規表現を引数に取れるようになった(Feature #13712)- 新メソッド
String#delete_prefix
、String#delete_prefix!
(Feature #12694)String#delete_suffix
、String#delete_suffix!
(Feature #13665)- 書記素(grapheme)クラスタを列挙する
String#each_grapheme_cluster
とString#grapheme_clusters
を追加(Feature #13780) String#undump
(String#dump
された文字列をunescapeする)(Feature #12275)
Struct
Struct.new
にkeyword_init: true
オプションを与えるとメンバをキーワード引数として初期化できるようになった(Feature #11925)
Regexp
とString
- Unicodeバージョンを9.0.0から10.0.0にアップデート(Feature #13685)
Thread
Thread#name=
で設定したdescriptionセットがWindows 10で表示されるようになった- 新メソッド
Thread#fetch
(Feature #13009)
Thread.report_on_exception
がデフォルトでtrue
になった: unhandled例外の終了スレッドを$stderr
に出力する(Feature #14143)
Time
Time#at
で、第2引数の単位を第2引数で指定できるようになった(Feature #13919)
KeyError
- 新メソッド
KeyError#receiver
(Feature #12063)KeyError#key
(Feature #12063)
FrozenError
- 新しい例外クラス(Feature #13224)
Stdlibの更新(主なもののみ)
Bundler
Bundlerを標準ライブラリに追加(Feature #12733)
Ruby 2.5.0 への Bundler 統合はお見送り。https://t.co/2wtkCvawM9
— Koichi ITO (@koic) 2017年12月23日
BigDecimal
- BigDecimal 1.3.4に更新
- 以下の機能を追加:
BigDecimal::VERSION
- 以下の機能を非推奨化(1.4.0で削除予定)
BigDecimal.new
BigDecimal.ver
BigDecimal#clone
と#BigDecimal#dup
で新規インスタンスを作成せずにレシーバ自身を返すようになった。
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
# }
# }
# }
結果のうち行カバレッジは変更されない(数値を含む単なるarray)。つまり各行のカウントは実行されたか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]
は、2行目1カラム目から6行目4カラム目までの範囲のif
ステートメントを示し、[:then, 1, 3, 2, 3, 8]
は3行目2カラム目から3行目8カラム目までの範囲のthen
句を示す。
メソッドカバレッジは次の形式を取る。
{ (method key) => (counter) }
method key
はフォーマットされる。
[class, method-name, start lineno, start column, end lineno, end column]
たとえば[Object, :foo, 1, 0, 7, 3]
は1行目0カラム目から7行目3カラム目の範囲にあるObject#foo
を示す。先の例ではObject#foo
は2回呼び出されている。
メモ: 互換性を保つため、オプションを付けない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
を追加:Hash
オブジェクトで渡されたローカル変数を持つテンプレートのレンダリング(Feature #8631)erb
コマンドでテンプレートファイルのデフォルトエンコーディングをASCII-8BITからUTF-8に変更(bug #14095)trim_mode
が指定されている場合に改行(carriage return)が正しく削除されるようになり、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 -- experimental)
- (experimental)
binding.irb
で自動的にirbがrequire
および実行されるようになった(Feature #13099) binding.irb
の呼び出し時にソースの前後が表示されるようになった(Feature #14124)
Matrix
- 新メソッド:
Matrix.combine
、Matrix#combine
(Feature #10903)Matrix#hadamard_product
Matrix#entrywise_product
Net::HTTP
Net::HTTP.new
でno_proxy
パラメータをサポート(Feature #11195)Net::HTTP#min_version
、Net::HTTP#max_version
(Feature #9450)- HTTPステータスクラスを追加
Net::HTTP::STATUS_CODES
がHTTP Status Code Repositoryとして追加(Misc #12935)Net::HTTP#proxy_user
とNet::HTTP#proxy_pass
で、システムの環境変数がマルチユーザーで安全な場合にhttp_proxy
環境変数を反映するようになった(bug #12921)
open-uri
URI.open
メソッドがopen-urlのKernel.open
のエイリアスとして定義された。open-urlのKernel.open
は今後非推奨化。
OpenSSL
- Ruby/OpenSSLを2.0から2.1にアップデート。変更点はext/openssl/History.mdの「Version 2.1.0」に記載。
Pathname
Pathname#glob
を追加(Feature #7360)
Psych
- Psych 3.0.2にアップデート
RbConfig
RbConfig::LIMITS
: C型の上限を指定。rbconfig/sizeof
をrequire
することで利用可
Ripper
Ripper::EXPR_BEG
など(Ripper#state
で使用)- メソッド追加
Ripper#state
スキャナのステートを指定(Feature #13686)
RDoc
- RDoc 6.0.1にアップデート
- IRBベースのlexerを
Ripper
に置き換えてドキュメント生成速度を大幅に向上(#512)- ドキュメント生成速度が大幅に向上。
- 今後の新文法のサポートが容易に。
- 過去数年分のRubyの新機能を多数サポート
frozen_string_literal: true
の利用: ドキュメント生成時間を5%短縮。did_you_mean
のサポート。
Rubygems
- Rubygems 2.7.3にアップデート
SecureRandom
- 新メソッド:
SecureRandom.alphanumeric
Set
- 新メソッド
Set#to_s
(inspect
のエイリアス)(Feature #13676)Set#===
(include?
のエイリアス)(Feature #13801)Set#reset
(Feature #6589)
StringIO
StringIO#write
で複数の引数を扱えるようになった
StringScanner
- 新メソッド:
StringScanner#size
/StringScanner#captures
/StringScanner#values_at
(Feature #836)
WEBrick
- SNI(Server Name Indication)をサポート(Feature #13729)
Zlib
Zlib::GzipWriter#write
で複数の引数を扱えるようになったProc
オブジェクトをbodyレスポンスとしてサポート(Feature #855)- RubyGemとしてリリース(Feature #13173)
- Kernel#openで意図しない振る舞いを回避(Misc #Kernel#open)
互換性の問題(featureやbug修正を除く)
Net::HTTP
Net::HTTP#start
がデフォルトで:ENV
をp_addr
に渡すようになった(bug #13351)これを回避するには明示的にnil
を渡す
- Socket
IO#read_nonblock
とIO#write_nonblock
でO_NONBLOCK
ファイルデスクリプションフラグを副作用として設定しないようになった(Linuxのみ)(Feature #13362)
- Random
Random.raw_seed
がシード以外にも利用できるようになったことでRandom.urandom
にリネームされた(bug #9569)
- Socket
Socket::Ifaddr#vhid
を追加(Feature #13803)
ConditionVariable
、Queue
、SizedQueue
を高速化のため再実装したことでStruct
のサブクラスでなくなった(Feature #13552)
Stdlibの互換性問題 (featureやbug修正を除く)
-
Gem化(Gemification)
- 以下の標準ライブラリをデフォルトgemへ移行促進。
- cmath
- csv
- date
- dbm
- etc
- fcntl
- fiddle
- fileutils
- gdbm
- ipaddr
- scanf
- sdbm
- stringio
- strscan
- webrick
- zlib
- 以下の標準ライブラリをデフォルトgemへ移行促進。
Logger
Logger.new(“| command”)
が意図せずコマンドを開いていた。現在は禁止され、Logger#initialize
は仕様どおりString引数だけをファイル名として扱うようになった(bug #14212)。
Net::HTTP
Net::HTTP#start
がデフォルトで:ENV
をp_addr
に渡すようになった(bug #13351)。これを回避するには明示的にnil
を渡す。
- mathn.rb
- stdlibから削除(Feature #10169)
- Rubygems
- ubygems.rbファイルをstdlibから削除(Ruby 1.9以降は不要)
C APIを更新
プラットフォームのサポート変更
- Chromium NaClプラットフォームのサポートを廃止
実装の改善
Hash
クラスのハッシュ関数がSipHash13に変更された(ユーザーからは見えないかもしれないが念のため)(Feature #13017)SecureRandom
でOpenSSLよりもOS提供のソースが推奨されるようになった(bug #9569)- ミューテックスを書き直してサイズ縮小&高速化(Feature #13517)
- lazyな
Proc
割り当てによってブロックを用いたブロック渡しのパフォーマンスを向上(Feature #14045) - traceインストラクションの代わりに
TracePoint
フック用の動的instrumentationでオーバーヘッドを回避(Feature #14104) - ERBのテンプレートからのコード生成がRuby 2.4の倍速くなった。
その他の変更
- (experimental)
STDERR
がttyから変更されていない場合にバックトレースやエラーメッセージを逆順で出力(Feature #8661) - (experimental)
STDERR
がttyから変更されていない場合にエラーメッセージをボールド/アンダーラインテキストで出力(Feature #14140) –with-ext
設定オプションで引数が省略不可になった: たとえば./configure –with-ext=openssl,+
を付けて実行するとOpenSSLライブラリをコンパイルすることを保証し、そうでない場合はビルドが異常終了する。
ただし引数の末尾に必ず,+
を付けなければならないことに注意。これを指定しないとOpenSSLだけがビルドされる(Feature #13302)