2012-04-16 17 views
62

Esta es una pregunta simple, espero. ¿Cómo verifico, en el siguiente ejemplo, si una constante ya está definida?Comprueba 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) 

Respuesta

105
CONST = 2 unless defined? CONST 

Ver here la información sobre los impresionantes defined? operador.

P.S. Y en el futuro, supongo que querrás var ||= 1 en lugar de var = var||1.

+0

gracias, que funciona! – peter

+5

También hay 'const_defined?' Pero no funciona para mí; no estoy seguro de por qué. –

+7

'const_defined?' Es un método de la clase 'Module' y le indicará si la constante está definida en ese módulo y sus antecesores (opcionalmente). Consulte los documentos para obtener algunos ejemplos: http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-const_defined-3F – jibiel

3
CONST ||= :default_value 

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

+0

:) 1.8 puede ser antiguo, pero aún está en uso en 2017, por ejemplo: alojamiento compartido de Dreamhost. – kitschmaster

+0

Veo que la mayoría de los proyectos ya han perdido soporte para ruby ​​1.8. Sé que todavía hay versiones de ruby ​​1.8 "compatibles", p. enviado por Red Hat Enterprise Linux. Están obteniendo parches de seguridad, pero uno se expone a muchos fallos de seguridad desconocidos en versiones antiguas de gemas utilizadas en cualquier aplicación que esté instalada. Entonces sí, la hay, pero es irrelevante para la mayoría de las personas. Al igual que hay y habrá durante mucho tiempo computadoras que ejecutan XP (recientemente se detectó un cajero automático de este tipo). – akostadinov

11

const_defined? API pry> User.const_defined?("PER_PAGE") => true pry> User.const_defined?("PER_PAGE123") => false

+1

Esto es especialmente útil cuando está comprobando si esto está definido de una manera dinámica. – DickieBoy

Cuestiones relacionadas