2010-01-06 9 views
38

Diciamo che sto usando irb e digitare a = 5. Come rimuovo la definizione di a in modo che digitando a restituisca un NameError?Undefine variabile in Ruby

po 'di contesto: poi voglio fare questo:

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

risposta

41

Esistono i metodi remove_class_variable, remove_instance_variable e remove_const ma attualmente non esiste alcun equivalente per le variabili locali.

+0

hmm, seccante che non ci siano metodi del genere. Suppongo di poter rimanere attaccato alle variabili di istanza per ora. – Peter

+0

Questi link non sembrano più essere nel posto giusto. – jcollum

+2

@jcollum grazie. 'remove_instance_variable' e' remove_const' sono metodi privati ​​quindi non sembrano più essere inclusi nella documentazione su ruby-doc.org. Ho aggiornato la risposta per utilizzare collegamenti equivalenti a apidock.com – mikej

1

Attualmente non si ha mezzo per rimuovere le variabili globali, variabili locali e variabili di classe. È possibile rimuovere le costanti utilizzando il metodo "remove_const" anche se

+3

Non è vero per le variabili di classe - non v'è remove_class_variable. – mikej

+1

oh! grazie mikej. non lo sapevo :) – Nakul

11

È sempre possibile "cancellare" il registro di irb delle variabili locali richiamando una subshell irb. Pensa a come funzionano le shell Bash rispetto alle variabili di ambiente non esportate. Dal momento che hai attivato la modalità interattiva, questa soluzione dovrebbe funzionare per questo.

Per quanto riguarda il codice di produzione, non vorrei indefinire le variabili locali come parte di una soluzione - gli hash con chiave probabilmente sarebbero migliori per quel tipo di scenario.

Ecco cosa intendo:

$ 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

Si può evitare di non-dichiarare una variabile, riducendo l'ambito in cui è presente la variabile:

def scope 
    yield 
end 

scope do 
    b = 1234 
end 

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

Questa è la risposta che volevo vedere. –

Problemi correlati