Ruby 2.7 の変更点 - 2.7.0 リリース!

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

qiita.com

12/25 に Ruby 2.7.0 がリリースされました! 🎉🎉🎉

2.7.0-rc2 との NEWS の差分を見てみます。

warning 抑止オプション

-W:no-deprecated オプションをつけると deprecated な warning が抑止されます。

% ruby -e 'def hoge(k:1); end; hoge({})'
-e:1: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
-e:1: warning: The called method `hoge' is defined here

% ruby -W:no-deprecated -e 'def hoge(k:1); end; hoge({})'

% ruby -e '$; = ""'
-e:1: warning: `$;' is deprecated

% ruby -W:no-deprecated -e '$; = ""'

いちいちオプションを指定するのが面倒な場合は RUBYOPT 環境変数に設定しておけばいいです。

% RUBYOPT='-W:no-deprecated' ruby -e '$; = ""'

-W:no-experimental オプションで experimental の warning が同様に抑止されます。

% ruby -e '0 in a; p a'
-e:1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!
0
% ruby -W:no-experimental -e '0 in a; p a'
0

Warning[]= でも設定できます。

Warning[:deprecated]    #=> true
Warning[:experimental]  #=> true
$; = ""  # warning: `$;' is deprecated

Warning[:deprecated] = false
Warning[:experimental] = false
$; = ""  # warning なし

Numbered parameter

exprerimental の記述がなくなりました! 🎉

#method, #instance_method が refinement 対応

class A
  def hoge
  end
end

module R
  refine A do
    def hoge
    end
  end
end

using R

A.instance_method(:hoge).source_location #=> ["test.rb", 8]
                                         # 2.6 では ["test.rb", 2]

Range#=== が String に対して Range#cover? を使う

2.6 では Range#include? を使っていましたが、String に対しては Range#cover? を使うようになったようです。

('A'..'Z').cover? "ANA"    #=> true
('A'..'Z').include? "ANA"  #=> false
('A'..'Z') === "ANA"       #=> true (2.6 では false)

おわり

これでアドベントカレンダーは終わりですが、いろいろ書かなかったものもあります。

速度向上とか、バンドルされなくなったライブラリとか、C API とか等々。

興味のある人は NEWS を読みましょう。

コミッターの人の解説記事もあります。

techlife.cookpad.com