Ruby 2.7 の変更点 - 始端省略 Range リテラル

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

qiita.com

始端省略 Range リテラル

範囲を表す Range オブジェクトはリテラルで 3..9 のように書くことができます。

Ruby 2.6 で終端を省略することができるようになりました。

range = (3..)
range.begin        #=> 3
range.end          #=> nil
range.each { p 1 } # 無限ループ

Ruby 2.7 ではさらに始端を省略することもできるようになりました。(ただし experimental)

range = ..9
range.begin        #=> nil
range.end          #=> 9
range.each { p 1 } # can't iterate from NilClass (TypeError)

始まりがないので繰り返しはエラーになります。

なお、始端と終端の両方を省略することはできません。

range = (..)  #=> syntax error, unexpected ')'

始端の省略は終端の省略よりも実用的ではないかもしれませんが、DSLに使うのに便利ってことみたいです。

たとえば、ORマッパーの Sequel は、7月にリリースされた 5.22 から既に次のように記述できるようになっています。

DB[:table].where(col: ..9).sql
#=> "SELECT * FROM table WHERE (col <= 9)"
DB[:table].where(col: ...9).sql
#=> "SELECT * FROM table WHERE (col < 9)"