Ruby2.6アドベントカレンダーの14日目の記事です。
Range
Range#step が Enumerator::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