Ruby 2.6 の変更点 - Range

Ruby2.6アドベントカレンダーの14日目の記事です。

qiita.com

Range

Range#stepEnumerator::ArithmeticSequence オブジェクトを返す

https://bugs.ruby-lang.org/issues/13904

単純な Enumerator ではなく step に指定した引数情報を取得できる Enumerator::ArithmeticSequence オブジェクトを返すようになりました。

a = (1..10).step(2)  #=> #<Enumerator::ArithmeticSequence>
a.begin            #=> 1
a.end              #=> 10
a.first(2)         #=> [1, 3]  # これは 2.5 から可能
a.last(2)          #=> [7, 9]
a.step             #=> 2

Added Range#% 追加

https://bugs.ruby-lang.org/issues/14697

Range#step (ブロック無し)の別名として Range#% が追加されました。

Range#===#include? だけではなく #cover? も使う

https://bugs.ruby-lang.org/issues/14575

2.5 では Range#=== は単純に Range#include? を呼び出してるだけでしたが、2.6 では次のように振る舞うようです(たぶん)。

  • 始端が数値または文字列であれば #include? を使う
  • そうでなければ #cover? を使う

これにより次のような比較ができるようになります。

(Date.today .. Date.today+1) === DateTime.now  #=> true (2.5 では false)

Range#cover? が Range オブジェクトも受けつける

https://bugs.ruby-lang.org/issues/14473

("a".."f").cover?("c".."e")  #=> true (2.5 では false)
("a".."f").cover?("c".."g")  #=> false