Techioz Blog

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)