- Ruby / Rails関連
READ MORE
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
do
/end
ブロック内でrescue
/else
/ensure
を利用できるようになった(Feature #12906)
文字列の式展開にrefinementsが効くようになった(Feature #13812)
Array
Array#append
(Feature #12746)Array#prepend
(Feature #12746)Data
Exception
Exception#full_message
で例外のString表現を取り出せるようになった: キャッチされていない例外をRubyが出力するときと同じフォーマットが使われる(Feature #14141 — experimental)Dir
Dir.glob
に新しいオプションキーワード引数:base
を追加 (Feature #13056)Dir.chdir
(ブロック引数なしの場合)、Dir.open
、Dir.new
、Dir.mkdir
、Dir.rmdir
、Dir.empty?
Dir.children
(Feature #11302)Dir.each_child
(Feature #11302)Enumerable
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)File.stat
、File.exist?
およびrb_stat()
を使うその他のメソッドで解放されるようになった(bug #13941)File.rename
でGVLが解放されるようになった(Feature #13951)File::Stat#atime
File::Stat#mtime
File::Stat#ctime
File::Stat#ino
とFile.indentical?
で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
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
RubyVM::InstructionSequence
RubyVM::InstructionSequence#each_child
RubyVM::InstructionSequence#trace_points
String
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)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
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
Bundler
Ruby 2.5.0 への Bundler 統合はお見送り。https://t.co/2wtkCvawM9
— Koichi ITO (@koic) 2017年12月23日
BigDecimal
BigDecimal::VERSION
BigDecimal.new
BigDecimal.ver
BigDecimal#clone
と#BigDecimal#dup
で新規インスタンスを作成せずにレシーバ自身を返すようになった。Coverage
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
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)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
Pathname
Pathname#glob
を追加(Feature #7360)Psych
RbConfig
RbConfig::LIMITS
: C型の上限を指定。rbconfig/sizeof
をrequire
することで利用可Ripper
Ripper::EXPR_BEG
など(Ripper#state
で使用)Ripper#state
スキャナのステートを指定(Feature #13686)RDoc
Ripper
に置き換えてドキュメント生成速度を大幅に向上(#512)
frozen_string_literal: true
の利用: ドキュメント生成時間を5%短縮。did_you_mean
のサポート。Rubygems
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
Zlib
Zlib::GzipWriter#write
で複数の引数を扱えるようになったProc
オブジェクトをbodyレスポンスとしてサポート(Feature #855)Net::HTTP
Net::HTTP#start
がデフォルトで:ENV
をp_addr
に渡すようになった(bug #13351)これを回避するには明示的にnil
を渡すIO#read_nonblock
とIO#write_nonblock
でO_NONBLOCK
ファイルデスクリプションフラグを副作用として設定しないようになった(Linuxのみ)(Feature #13362)Random.raw_seed
がシード以外にも利用できるようになったことでRandom.urandom
にリネームされた(bug #9569)Socket::Ifaddr#vhid
を追加(Feature #13803)ConditionVariable
、Queue
、SizedQueue
を高速化のため再実装したことでStruct
のサブクラスでなくなった(Feature #13552)
Gem化(Gemification)
Logger
Logger.new(“| command”)
が意図せずコマンドを開いていた。現在は禁止され、Logger#initialize
は仕様どおりString引数だけをファイル名として扱うようになった(bug #14212)。Net::HTTP
Net::HTTP#start
がデフォルトで:ENV
をp_addr
に渡すようになった(bug #13351)。これを回避するには明示的にnil
を渡す。Hash
クラスのハッシュ関数がSipHash13に変更された(ユーザーからは見えないかもしれないが念のため)(Feature #13017)SecureRandom
でOpenSSLよりもOS提供のソースが推奨されるようになった(bug #9569)Proc
割り当てによってブロックを用いたブロック渡しのパフォーマンスを向上(Feature #14045)TracePoint
フック用の動的instrumentationでオーバーヘッドを回避(Feature #14104)STDERR
がttyから変更されていない場合にバックトレースやエラーメッセージを逆順で出力(Feature #8661)STDERR
がttyから変更されていない場合にエラーメッセージをボールド/アンダーラインテキストで出力(Feature #14140)–with-ext
設定オプションで引数が省略不可になった: たとえば./configure –with-ext=openssl,+
を付けて実行するとOpenSSLライブラリをコンパイルすることを保証し、そうでない場合はビルドが異常終了する。ただし引数の末尾に必ず,+
を付けなければならないことに注意。これを指定しないとOpenSSLだけがビルドされる(Feature #13302)