Два действительно не имеют ничего общего друг с другом. В частности, #==
является оператором равенства, а #===
не имеет ничего общего с равенством. Лично я считаю весьма прискорбным, что #===
выглядит так же, как #==
, использует знак равенства и часто называется оператором равенства , , оператором тройного равенства или оператор тройного оператора , когда он действительно не имеет ничего общего с равенством.
Я звоню #===
оператор подстановки падежа (это лучшее, что я могу придумать, я открыт для предложений, особенно от носителей английского языка).
Лучший способ описать a === b
- это "если у меня есть ящик с надписью a
, имеет ли смысл в него ставить b
?"
Так, например, Module#===
проверяет, является ли b.is_a?(a)
. Если у вас Integer === 2
, имеет ли смысл поместить 2
в коробку с надписью Integer
? Да, это так. А как насчет Integer === 'hello'
? Очевидно, нет.
Другой пример - Regexp#===
. Это тесты на совпадение. Имеет ли смысл ставить 'hello'
в поле с надписью /el+/
? Да, это так.
Для коллекций, таких как диапазоны, Range#===
определяется как проверка принадлежности: имеет смысл поместить элемент в поле, помеченное коллекцией, если этот элемент находится в коллекции.
Итак, вот что делает #===
: он проверяет, может ли аргумент быть включен в получатель.
Какое это имеет отношение к case
выражениям? Простой:
case foo
when bar
baz
end
совпадает с
if bar === foo
baz
end