Я только что заметил, что Array не переопределяет метод тройного знака равенства ===
, который иногда называют методом равенства регистра.
x = 2
case x
when [1, 2, 3] then "match"
else "no match"
end # => "no match"
, тогда как оператор диапазона делает:
x = 2
case x
when 1..3 then "match"
else "no match"
end # => "match"
Вы можете сделать обходной путь для массивов, однако:
x = 2
case x
when *[1, 2, 3] then "match"
else "no match"
end # => "match"
Известно, почему это так?
Это потому, что это более вероятно для x
быть фактическим массивом, а не диапазоном, и переопределение массива ===
будет означать, что обычное равенство не будет совпадением?
# This is ok, because x being 1..3 is a very unlikely event
# But if this behavior occurred with arrays, chaos would ensue?
x = 1..3
case x
when 1..3 then "match"
else "no match"
end # => "no match"