2010-01-06 7 views
38

Supposons que j'utilise irb et que vous tapez a = 5. Comment puis-je supprimer la définition de a afin que la saisie a renvoie NameError?Undefine variable dans Ruby

Quelques contexte: plus tard, je veux faire:

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

Répondre

41

Il y a remove_class_variable, remove_instance_variable et remove_const méthodes, mais il n'y a actuellement pas d'équivalent pour les variables locales.

+0

hmm, ennuyeux qu'il n'y a pas de méthodes comme ça. Je suppose que je peux m'en tenir aux variables d'instance pour le moment. – Peter

+0

Ces liens ne semblent plus aller au bon endroit. – jcollum

+2

@jcollum merci. 'remove_instance_variable' et' remove_const' sont des méthodes privées donc ne semblent plus être inclus dans la documentation sur ruby-doc.org. J'ai mis à jour la réponse pour utiliser des liens équivalents à apidock.com – mikej

1

Actuellement, vous avez aucun moyen de supprimer les variables globales, variables locales et variables de classe. Vous pouvez supprimer des constantes en utilisant la méthode « de remove_const » si

+3

Pas vrai pour les variables de classe - il y a remove_class_variable. – mikej

+1

oh! merci mikej. Je ne savais pas que :) – Nakul

11

Vous pouvez toujours 'effacer' le registre de variables locales d'irb en invoquant un sous-shell IRB. Pensez au fonctionnement des shells Bash par rapport aux variables d'environnement non exportées. Depuis que vous avez mis en mode interactif, cette solution devrait fonctionner pour cela.

En ce qui concerne le code de production, je ne voudrais pas annuler la définition des variables locales dans le cadre d'une solution - les hachages à clé seraient probablement meilleurs pour ce type de scénario.

Voici ce que je veux dire:

$ 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

Vous pouvez éviter un-déclarer la variable en réduisant la portée dans laquelle la variable existe:

def scope 
    yield 
end 

scope do 
    b = 1234 
end 

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

Ceci est la réponse que je voulais voir. –

Questions connexes