Ruby 2.7 アドベントカレンダーの6日目の記事です。
始端省略 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)"