Ruby 4.0 リファレンスマニュアル

instance method Range#===

self === obj -> bool[permalink][rdoc][edit]
(untyped obj) → bool

始端と終端の中に obj があるとき、true を返します。そうでないとき、false を返します。

Range#=== は主に case 式での比較に用いられます。

p (0...50) === 79  # => false
p (60...80) === 79 # => true

case 79
when  0...60  then  puts "low"
when 60...80  then  puts "medium" # => medium
when 80..100  then  puts "high"
end

Ruby 2.5 までは、単純に Range#include? メソッドを内部で呼んでいました。

しかし、Ruby 2.6 以降では、(文字列を除いて) Range#cover? と同様の処理をするように切り替わりました。

ただし、=== は、Range#cover? のように Range オブジェクトを引数にとる設計はありません。

require 'date'
p (Date.today - 100...Date.today + 100).include?(DateTime.now)  # => false
p (Date.today - 100...Date.today + 100).cover?(DateTime.now)    # => true
p (Date.today - 100...Date.today + 100) ===  DateTime.now       # => true
# Ruby 2.5 までは、=== は、include? と同じく比較できず false を返していました。

Ruby 2.7 以降の === は、文字列も Range#cover? と同様の処理をするようになりました。

p ('a'..'z').include? 'at'  # => false
p ('a'..'z').cover? 'at'    # => true
p ('a'..'z') === 'at'       # => true
# Ruby 2.6 までは、=== は、include? と同じく比較できず false を返していました。

[SEE_ALSO] 制御構造/case

[SEE_ALSO] Range#include?, Range#cover?