(Ruby)如何检查范围是否包含另一个范围的子集?

16 ruby range

如果我有两个重叠的范围:

x = 1..10
y = 5..15
Run Code Online (Sandbox Code Playgroud)

当我说:

puts x.include? y 
Run Code Online (Sandbox Code Playgroud)

输出是:

false 
Run Code Online (Sandbox Code Playgroud)

因为这两个范围只是部分重叠.

但是如果我希望当两个范围之间存在部分重叠时它是"真实的",我该怎么写呢?换句话说,我需要一种方法来知道一个范围何时包含另一个范围的子集.我假设有一种优雅的方式在Ruby中编写它,但我能想到的唯一解决方案是冗长的.

Mar*_*usQ 61

有效的方法是比较限制

(x.first <= y.last) and (y.first <= x.last)
Run Code Online (Sandbox Code Playgroud)


小智 8

使用大范围时要小心,但这是一种优雅的方法:

(x.to_a & y.to_a).empty?
Run Code Online (Sandbox Code Playgroud)

  • 这是 O(N) 内存和时间 vs @MarkusQ 的 O(1) 方式。 (2认同)

Vin*_*sil 6

如果您使用的是 Ruby 2.6,则可以Range#cover?与另一个Range.

(1..5).cover?(2..3)     #=> true
(1..5).cover?(0..6)     #=> false
(1..5).cover?(1...6)    #=> true
Run Code Online (Sandbox Code Playgroud)