Вы можете использовать Module.const_get
, чтобы получить константу, на которую ссылается строка. Он вернет константу (как правило, на классы ссылаются константы). Затем вы можете проверить, является ли константа классом.
Я хотел бы сделать что-то вдоль этих линий:
def class_exists?(class_name)
klass = Module.const_get(class_name)
return klass.is_a?(Class)
rescue NameError
return false
end
Кроме того, если это возможно, я всегда избегать использования eval
при приеме пользовательского ввода; Я сомневаюсь, что это будет использоваться для любого серьезного применения, но стоит осознавать риски безопасности.
Это лучший способ сделать это. Множество случаев в драгоценных камнях нужно делать так же, как это. определены? :: Rails – Brandt
'defined? (MyClassName) == 'constant' && MyClassName.is_a? (Класс)' выглядит более интуитивно понятным. –
Почему «определено? Object.const_get ("array" .capitalize) 'возвращает метод", а я запускаю 'defined? Array 'return" constant "? – kamal