例えば、2022年現在のお盆の期間を Range オブジェクトで保持しているようなケースを考える。
require 'date'
# 2022年のお盆の期間
THIS_YEAR_OBON_RANGE = (Date.parse('2022-08-13')..Date.parse('2022-08-16'))
これを元に、お盆の開始日と終了日をそれぞれ変数に格納しようと思った場合、素直に書くとこうなる。
from = THIS_YEAR_OBON_RANGE.first
to = THIS_YEAR_OBON_RANGE.last
これを1行で書きたいとき、minmax
を使うと多重代入で済むので便利だと気づいた。
from, to = THIS_YEAR_OBON_RANGE.minmax
若干トリッキーではあるので、他に良い書き方があれば知りたい。
なお、この書き換えが通用するのは min
で始端、max
で終端が取得できる場合のみであって、一般には等価な書き換えではないことに注意。以下のようなケースでは結果が違ってきたりエラーが発生したりする:
- Range オブジェクトが終端を含まない範囲である場合(
(10...20)
など) - 始端や終端を持たない場合(
(10..nil)
や(nil..20)
など) - 始端より終端が大きい場合 (
(20..10)
など)