Rubyで2つの範囲が重なっているかどうかを確認する
概要
私は次のことができることを知っています:
(1..30).cover?(2)
=> true
しかし、別の範囲で同じことをしようとすると、常に false が返されます。
(1..30).cover?(2..3)
=> false
そこで私の質問は、Ruby で 2 つの範囲を比較するエレガントな方法はあるのかということです。私の場合、2 つの DateTime 範囲が重複しているかどうかを確認したいと考えています。前もって感謝します。
解決策
次の場合、特定の範囲 A で 2 つの範囲が重複します。
例:
Range A |-----|
|-----| Case 1
|-----| Case 2
|-| Case 1 + 2
|---------| Case 3
詳しく見ると、ルールは次のとおりです。範囲 A が終了する前に範囲 B が開始され、範囲 A が開始された後に範囲 B が終了する場合、2 つの範囲は重複します。
def ranges_overlap?(range_a, range_b)
range_b.begin <= range_a.end && range_a.begin <= range_b.end
end
または、最新バージョンの Ruby を使用している場合は、Range#overlap? を使用できます。 Ruby 3.3 で導入されたメソッドは次のようになります。
range_a.overlap?(range_b)