case
вызывает ===
, оператор равенства регистра.Module#===
и, по расширению Class#===
, фактически проверяет, является ли данный класс аргумента получателем или одним из его потомков.String === object
практически эквивалентно object.kind_of? String
.
convert 1, String
Будет эквивалентно:
case String
when Integer
1.to_i
when String
1.to_s
end
Это все равно, что спрашивать is the String class an Integer?
или is the String class a String?
.Ответ на оба вопроса: No, it is a Class.
.
С точки зрения кода, String.class
возвращает Class
, что никак не связано с Integer
или даже String
.Если вы ввели предложение when Class
или when Module
, оно будет выполняться каждый раз.