2010-01-06 18 views
38

Angenommen, ich verwende irb und geben Sie a = 5 ein. Wie entferne ich die Definition von a, so dass die Eingabe a eine NameError zurückgibt?Variablen in Ruby nicht definieren

Einige Kontext: später möchte ich dies tun:

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

Antwort

41

Es gibt remove_class_variable, remove_instance_variable und remove_const Methoden, aber es gibt derzeit keine Entsprechung für lokale Variablen.

+0

hmm, nervig, dass es solche Methoden nicht gibt. Ich denke, ich kann mich vorerst an Instanzvariablen halten. – Peter

+0

Diese Links sehen nicht mehr so ​​aus, als würden sie an den richtigen Ort gehen. – jcollum

+2

@jcollum danke. 'remove_instance_variable' und' remove_const' sind private Methoden und scheinen nicht mehr in der Dokumentation von ruby-doc.org enthalten zu sein. Ich habe die Antwort aktualisiert, um äquivalente Links zu apidock.com zu verwenden. – mikej

1

Derzeit haben Sie keine Mittel haben globale Variablen, lokale Variablen und Klassenvariablen zu entfernen. Sie können Konstanten mit der Methode "remove_const" entfernen, obwohl

+3

Nicht wahr für Klassenvariablen - es remove_class_variable ist. – mikej

+1

oh! Danke Mike. wusste das nicht :) – Nakul

11

Sie können die irb-Registry für lokale Variablen immer löschen, indem Sie eine irb-Subshell aufrufen. Stellen Sie sich vor, wie Bash-Shells in Bezug auf nicht exportierte Umgebungsvariablen funktionieren. Da Sie den interaktiven Modus gewählt haben, sollte diese Lösung dafür geeignet sein.

Was Produktionscode betrifft, möchte ich lokale Variablen nicht als Teil einer Lösung definieren - Schlüssel-Hashes wären wahrscheinlich besser für diese Art von Szenario.

Hier ist, was ich meine:

$ 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

Sie un-Deklaration vermeiden können die Variable durch den Umfang zu reduzieren, in dem die Variable existiert:

def scope 
    yield 
end 

scope do 
    b = 1234 
end 

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

Dies ist die Antwort, die ich sehen wollte. –

Verwandte Themen