¿Cómo convierto una cadena en un nombre de clase, pero solo si esa clase ya existe?¿Cómo verifico si una clase está definida?
Si ámbar es ya una clase, que puedo conseguir de una cadena a la clase a través de:
Object.const_get("Amber")
o (en Rails)
"Amber".constantize
Pero ninguno de estos fallará con NameError: uninitialized constant Amber
si Amber ya no es una clase.
Mi primera idea es utilizar el método defined?
, pero no discrimina entre las clases que ya existen y las que no lo hacen:
>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"
Entonces, ¿cómo puedo probar si una cadena nombra una clase antes de intentar convertirlo? (Bien, ¿qué tal un bloque begin
/rescue
para detectar errores NameError? Demasiado feo? Estoy de acuerdo ...)
'' definido en el ejemplo está haciendo exactamente lo que se supone que debe hacer: Se comprueba si se ha definido el método 'constantize' en un objeto String. No importa si la cadena contiene "Object" o "AClassNameThatCouldNotPossiblyExist". – ToniTornado