В чем разница между
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
и
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
По какой-то причине первый из них иногда работает, а второй - нет, а иногда второй работает, а первый - нет. Зачем? Какой из них «правильный» способ сделать это?
ruby
duck-typing
case-statement
Дейзи София Холлман
источник
источник
MyClass === obj
используется метод Module # ===, чтобы проверить,obj
является ли он экземпляромMyClass
.Ответы:
Вы должны использовать:
У меня была такая же проблема: как отловить класс Errno :: ECONNRESET в "случае когда"?
источник
Да, Накилон прав, вы должны знать, как оператор threequal === работает с объектом, указанным в
when
предложении. В рубинедействительно
Поймите, что case вызывает метод threequal (
MyClass.===(item)
например), и этот метод может быть определен так, чтобы делать все, что вы хотите, а затем вы можете использовать оператор case с точностью.источник
arr = []
то я заметил, что онif Array === arr
будет оцениваться как true, ноif arr === Array
будет оцениваться как false. Может кто-нибудь помочь объяснить?Ты можешь использовать:
... когда невозможен следующий поворот:
Причина этого в том, что он
case
использует===
, а отношения,===
описываемые оператором, не коммутативны . Например,5
этоInteger
, но ? Вот как вы должны думать о / .Integer
5
case
when
источник
В Ruby имя класса - это константа, которая относится к объекту типа
Class
, описывающего конкретный класс. Это означает, что высказываниеMyClass
в Ruby эквивалентно высказываниюMyClass.class
в Java.obj.class
это объект типаClass
описывающего классobj
. Еслиobj.class
естьMyClass
, тоobj
было создано с помощьюMyClass.new
(грубо говоря).MyClass
это объект типа,Class
который описывает любой объект, созданный с использованиемMyClass.new
.MyClass.class
- это классMyClass
объекта (это класс объекта типа,Class
который описывает любой объект, созданный с помощьюMyClass.new
). Другими словами,MyClass.class == Class
.источник
Это зависит от характера вашей
item
переменной. Если это экземпляр объекта, напримерзатем
но если это класс сам по себе, например
тогда это будет
Class
объект, поэтомуРЕДАКТИРОВАТЬ : см. Как поймать класс Errno :: ECONNRESET в «случае, когда»? как заявил Накилон, поскольку мой ответ может быть неправильным.
источник