Типы классов Ruby и операторы case
38431 просмотра
5 ответа
В чем разница между
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
По какой-то причине первый из них иногда работает, а второй нет, а в других случаях второй работает, а первый - нет. Почему? Какой из них «правильный» способ сделать это?
Автор: David Hollman Источник Размещён: 13.11.2019 11:49Ответы (5)
214 плюса
Вы должны использовать:
case item
when MyClass
...
У меня была такая же проблема: как отловить класс Errno :: ECONNRESET в «случае, когда»?
Автор: Nakilon Размещён: 11.10.2010 05:1154 плюса
Да, Накилон прав, вы должны знать, как работает оператор triqual === для объекта, указанного в when
предложении. В рубине
case item
when MyClass
...
when Array
...
when String
...
действительно
if MyClass === item
...
elsif Array === item
...
elsif String === item
...
Поймите, что case вызывает трехзначный метод ( MyClass.===(item)
например), и этот метод может быть определен, чтобы делать все, что вы хотите, а затем вы можете использовать оператор case с precisionw
10 плюса
Вы можете использовать:
case item.class.to_s
when 'MyClass'
... когда следующий поворот невозможен:
case item
when MyClass
Причина этого в том, что case
используются ===
, а отношения, которые ===
описывает оператор, не являются коммутативными . Например, 5
это Integer
, но ? Вот как вы должны думать о / .Integer
5
case
when
5 плюса
В 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
.
1 плюс
Это зависит от характера вашей item
переменной. Если это экземпляр объекта, например
t = 5
тогда
t.class == Fixnum
но если это класс сам по себе, например,
t = Array
тогда это будет Class
объект, так
t.class == Class
РЕДАКТИРОВАТЬ : пожалуйста, обратитесь к разделу Как поймать класс Errno :: ECONNRESET в "случае, когда"? как заявил Накилон, так как мой ответ может быть неправильным.
Автор: Jack Размещён: 11.10.2010 05:11Вопросы из категории :
- ruby Вызов команд оболочки из Ruby
- ruby Почему в Ruby нет реального StringBuffer или StringIO?
- ruby Как создать случайный 10-значный номер в рубине?
- ruby Каков наилучший способ конвертировать массив в хеш в Ruby
- ruby Determine file type in Ruby
- ruby Раскладка каталога для чистого Ruby-проекта
- duck-typing Типы классов Ruby и операторы case
- duck-typing Что такое утка?
- duck-typing Дак набирает в компиляторе C #
- duck-typing Как определить numy-типы в python?
- duck-typing Return one of two possible objects of different types sharing a method
- duck-typing TypeScript Duck Typing, хотите сильную статическую печать
- case-statement Как использовать шаблоны в выписке?
- case-statement Использование Bash Case Statement для удаления файлов
- case-statement Verilog - вызов модуля внутри оператора case
- case-statement Verilog проблема с делом / всегда заявление
- case-statement Получение количества дел в коммутаторе в C