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)
pedro
fuente

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.

Jibiel
fuente
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
25

const_defined? API

pry> User.const_defined?("PER_PAGE")
=> true
pry> User.const_defined?("PER_PAGE123")
=> false
rusllonrails
fuente
1
Esto es especialmente útil cuando comprueba si está definido de forma dinámica.
DickieBoy
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.

Akostadinov
fuente
:) 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