Как превратить строку в имя класса, но только если этот класс уже существует?
Если Amber уже является классом, я могу перейти от строки к классу с помощью:
Object.const_get("Amber")
или (в рельсах)
"Amber".constantize
Но любой из них потерпит неудачу с NameError: uninitialized constant Amber
, если Эмбер еще не является классом.
Моя первая мысль — использовать метод defined?
, но он не делает различий между уже существующими классами и теми, которых нет:
>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"
Итак, как мне проверить, является ли строка именем класса, прежде чем пытаться ее преобразовать? (Хорошо, как насчет блока begin
/rescue
для обнаружения ошибок NameError? Слишком уродливо? Согласен...)
defined?
в этом примере делает именно то, что должен делать: он проверяет, определен ли методconstantize
для объекта String. Неважно, содержит ли строка Object или AClassNameThatCouldNotPossilyExist. - person ToniTornado   schedule 08.05.2017