2010-01-06 17 views
38

Digamos que estoy usando irb y escriba a = 5. ¿Cómo elimino la definición de a para que al escribir a se devuelva un NameError?Define la variable en Ruby

un poco de contexto: después me desee hacer esto:

context = Proc.new{}.binding 
context.eval 'a = 5' 
context.eval 'undef a' # though this doesn't work. 

Respuesta

41

Hay remove_class_variable, remove_instance_variable y remove_const métodos, pero actualmente no hay equivalente para las variables locales.

+0

hmm, molesto que no hay ningún método como ese. Supongo que puedo apegarme a las variables de instancia por ahora. – Peter

+0

Esos enlaces ya no parecen estar yendo al lugar correcto. – jcollum

+2

@jcollum gracias. 'remove_instance_variable' y' remove_const' son métodos privados, por lo que parece que ya no están incluidos en la documentación de ruby-doc.org. He actualizado la respuesta para usar enlaces equivalentes a apidock.com – mikej

1

Actualmente tiene ningún medio para eliminar las variables globales, variables locales y variables de clase. Puede eliminar constantes usando el método "remove_const" a través de

+3

cierto para las variables de clase - no es remove_class_variable. – mikej

+1

¡oh! gracias mikej. no sabía eso :) – Nakul

11

Siempre puede 'borrar' el registro de las variables locales de irb invocando una subshell irb. Piensa en cómo funcionan los shells Bash con respecto a las variables de entorno no exportado. Como mencionó el modo interactivo, esta solución debería funcionar para eso.

En cuanto al código de producción, no me gustaría definir las variables locales como parte de una solución: los hashes con clave probablemente serían mejores para ese tipo de escenario.

Esto es lo que quiero decir:

$ irb 
irb(main):001:0> a = "a" 
=> "a" 
irb(main):002:0> defined? a 
=> "local-variable" 
irb(main):003:0> irb # step into subshell with its own locals 
irb#1(main):001:0> defined? a 
=> nil 
irb#1(main):002:0> a 
NameError: undefined local variable or method `a' for main:Object 
    from /Users/dean/.irbrc:108:in `method_missing' 
    from (irb#1):2 
irb#1(main):003:0> exit 
=> #<IRB::Irb: @context=#<IRB::Context:0x1011b48b8>, @signal_status=:IN_EVAL, @scanner=#<RubyLex:0x1011b3df0>> 
irb(main):004:0> a # now we're back and a exists again 
=> "a" 
15

Usted puede evitar un-declarar la variable mediante la reducción del ámbito en el que existe la variable:

def scope 
    yield 
end 

scope do 
    b = 1234 
end 

b # undefined local variable or method `b' for main:Object 
No
+2

Esta es la respuesta que quería ver. –

Cuestiones relacionadas