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)" 
コメントを書く

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

プロフィール
注目記事