Ruby 2.7 アドベントカレンダーの25日目の記事です。
12/25 に Ruby 2.7.0 がリリースされました! 🎉🎉🎉
2.7.0-rc2 との NEWS の差分を見てみます。
- warning 抑止オプション
- Numbered parameter
- #method, #instance_method が refinement 対応
- Range#=== が String に対して Range#cover? を使う
- おわり
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 を読みましょう。
コミッターの人の解説記事もあります。