=== — метод case equality, применяемый в ветках case/when. Его смысл задаёт левый операнд: класс проверяет принадлежность типу, диапазон — попадание в диапазон, Regexp — соответствие шаблону, Proc вызывает свой блок. Это не аналог строгого равенства JavaScript. Для символов :test === "test" возвращает false.
Что такое оператор === в Ruby?
Case equality в Ruby: поведение классов, диапазонов, регулярных выражений и Proc, а также различие символа и строки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Ruby оператор === — вызов метода левого операнда. Его часто называют case equality, потому что обычный case value сопоставляет каждое условие when через условие === value.
String === "hello" # true
(1..10) === 5 # true
/ruby/ === "I use ruby" # true
(->(x) { x > 3 }) === 5 # true
:test === :test # true
:test === "test" # false
У класса или модуля проверяется, является ли объект экземпляром соответствующего класса либо принадлежит ли его цепочке предков. Например, Numeric === 5 истинно, хотя непосредственный класс числа — Integer. У диапазона проверяется попадание значения, у регулярного выражения — совпадение, а Proc#=== передаёт аргументы в proc. Результат proc не обязан быть логическим; case учитывает его истинность.
value = "ruby developer"
case value
when Integer
puts "Число"
when /ruby/
puts "Строка о Ruby"
else
puts "Другой вариант"
end
Вторая ветка сработает раньше любых последующих проверок. Это не сравнение идентичности и не «равенство без преобразования типов» по правилам другого языка. У обычных объектов поведение часто совпадает с ==, но класс может переопределить метод под собственную семантику.
Важно не путать обычный case/when с pattern matching через case/in: последний включает дополнительные правила сопоставления и деконструкцию. И символ не становится строкой автоматически: :test и "test" остаются разными объектами разных типов. Условия Ruby, Symbol.