Compruebe si una constante ya está definida


82

Este es simple, espero. ¿Cómo verifico, en el siguiente ejemplo, si una constante ya está definida?

#this works
var = var||1
puts var
var = var||2
puts var

#this doesn't
CONST = CONST||1
puts CONST
CONST = CONST||2
puts CONST

=> 1
   1
   uninitialized constant CONST (NameError)

Respuestas:


133
CONST = 2 unless defined? CONST

Consulte aquí para obtener más información sobre el defined?operador impresionante .

PD: Y en el futuro supongo que querrás en var ||= 1lugar de var = var||1.


6
También hay, const_defined?pero no me funciona; no estoy seguro de por qué.
Jared Beck

8
const_defined?es un método de Moduleclase y le dirá si la constante está definida en ese módulo y sus ancestros (opcionalmente). Consulte los documentos para ver algunos ejemplos: ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F
jibiel


Gracias por esta respuesta ... gran solución para no poder usar || = confiablemente con un booleano
Chuck van der Linden

Esto también funciona muy bien para los métodos, no solo para las constantes.
Joshua Pinter


4
CONST ||= :default_value

lo anterior funciona para mí en ruby ​​1.9.3 pero falla en 1.8 ... bueno, 1.8 es antiguo ahora.


:) 1.8 puede ser antiguo, pero todavía está en uso en 2017, ejemplo: alojamiento compartido de Dreamhost.
manitu

Veo que la mayoría de los proyectos ya han dejado de admitir ruby ​​1.8. Sé que todavía hay versiones ruby ​​1.8 "soportadas", por ejemplo, enviadas por Red Hat Enterprise Linux. Están recibiendo parches de seguridad, pero uno expone a muchas fallas de seguridad desconocidas en versiones antiguas de gemas utilizadas en cualquier aplicación instalada. Entonces sí, lo hay, pero es irrelevante para la mayoría de la gente. Como hay y habrá durante mucho tiempo computadoras con XP (recientemente se detectó nuevamente un cajero automático de este tipo).
akostadinov
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.