Ruby 2.7 アドベントカレンダーの20日目の記事です。
- GC.compact 追加
- Method#inspect : 出力が詳しく
- NilClass#to_s / TrueClass#to_s / FalseClass#to_s : 同じオブジェクトを返す
- Proc#to_s 形式変更
- RubyVM.resolve_feature_path が $LOAD_PATH.resolve_feature_path に移動
GC.compact 追加
メモリの獲得&解放を繰り返してるとあちこちに空きができて、メモリの使用が非効率になってしまいます。 2.7 で追加された GC.compact を使用すると、メモリ内のオブジェクトを移動して、使わないメモリを解放することができるようになるみたいです。
Method#inspect : 出力が詳しく
Method#inspect
で行番号や引数が出力されるようになりました。
class A def hoge(a) p a end end p A.new.method(:hoge) #=> 2.7 : #<Method: A#hoge(a) test.rb:2> #=> 2.6 : #<Method: A#hoge>
NilClass#to_s / TrueClass#to_s / FalseClass#to_s : 同じオブジェクトを返す
nil.to_s
, true.to_s
, false.to_s
が返す文字列が freeze された同じオブジェクトを返すようになります。
# 2.6 nil.to_s.frozen? #=> false nil.to_s.object_id #=> 47056214160500 nil.to_s.object_id #=> 47056215393900 # 2.7 nil.to_s.frozen? #=> true nil.to_s.object_id #=> 140 nil.to_s.object_id #=> 140
Proc#to_s 形式変更
@
が空白に変更されました。
p proc{ 123 } # 2.6 : <Proc:0x0000564e0d195bc0@test.rb:1> # 2.7 : <Proc:0x0000558b263d2b18 test.rb:1>
RubyVM.resolve_feature_path が $LOAD_PATH.resolve_feature_path に移動
RubyVM.resolve_feathre_path
は 2.6 で追加された require で読まれるファイルの場所を返すメソッドです。
RubyVM.resolve_feature_path "time" #=> [:rb, "/usr/local/lib/ruby/2.6.0/time.rb"]
RubyVM
はC実装のRuby(MRI)にしか存在しないので、他の Ruby 実装でも使えるようにということで、$LOAD_PATH
の特異メソッドに変更されたようです。
$LOAD_PATH.resolve_feature_path "time" #=> [:rb, "/usr/local/lib/ruby/2.7.0/time.rb"]