Ruby 2.7 の変更点 - GC / Method / NilClass / TrueClass / FalseClass / Proc / RubyVM

Ruby 2.7 アドベントカレンダーの20日目の記事です。

qiita.com

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"]