Pregunta

Digamos que estoy usando irb y escriba a = 5. ¿Cómo se quita la definición de a modo que a tipificación devuelve un NameError?

Algunos contexto: más adelante quiero hacer esto:

context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a'  # though this doesn't work.
¿Fue útil?

Solución

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

Otros consejos

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

Siempre se puede registro 'clara' del IRB de variables locales mediante la invocación de un subnivel IRB. Piense en cómo funcionan las cáscaras del golpe con respecto a las variables de entorno no exportadas. Ya que metioned modo interactivo, esta solución se debe trabajar para eso.

Por lo que el código de producción, no me gustaría quitar la definición de las variables locales como parte de una solución -. Hashes introducido probablemente sería mejor 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"

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

En el espíritu de la cuestión, se podría limitar la variable a un ámbito, suponiendo que son bien con otras variables locales que se bloquean en el mismo ámbito. Esto es útil sobre todo si se está definiendo algo en una clase y no quieres que la variable local a permanecer alrededor de la declaración de clase.

Las únicas maneras en que puedo pensar para hacer esto es con Integer#times o Array#each este modo:

1.times do |a|
  a = 5
  # code…
end

[5].each do |a|
  # code…
end

Probablemente hay otras maneras, incluso más limpias para limitar a un bloque aparte de esto. Estos no son tan limpia como me gustaría y me gustaría ver si alguien tiene un método más limpio a utilizar para hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top