Это потому, что оператор case не использует оператор ==, он использует оператор === (иногда называемый оператором равенства регистра).Что это делает, зависит от того, что находится слева от оператора.Итак, если бы вы должны были преобразовать оператор case следующим образом:
case "Some string"
when String
puts "It's a string!"
else
puts "It's not a string!"
end
В оператор if, он стал бы таким:
if String === "Some string"
puts "It's a string!"
else
puts "It's not a string!"
end
Обратите внимание, что Ruby делает это в обратном направлении от того, что вы ожидаете, это String === "Some string"
.Это потому, что вы действительно хотите позвонить Class#===
здесь, а не String#===
.То, что оператор === делает для любого объекта, действительно зависит от класса.В случае Class#===
это примерно эквивалентно вызову "Some string".is_a?(String)
.Но если вы сделаете "a" === "b"
, метод String#===
будет примерно эквивалентен String#==
.
Это может запутать, но использование оператора в значительной степени идиоматично.Другими словами, идиома «объект класса в операторе when» означает проверку того, принадлежит ли объект case этого класса.Я написал статью об этом, которая объясняет это немного больше, вы можете прочитать это здесь .