Question

Disons que j'utilise irb et tapez a = 5. Comment puis-je supprimer la définition de a de sorte que a de frappe retourne un NameError?

Quelques contexte: plus tard, je veux faire ceci:

context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a'  # though this doesn't work.
Était-ce utile?

La solution

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.

Autres conseils

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

Vous pouvez toujours registre de « clair » irb des variables locales en invoquant un sous-shell RIR. Pensez à la façon dont les coquilles Bash travaillent par rapport aux variables d'environnement non exportées. Puisque vous metioned mode interactif, cette solution doit travailler pour cela.

En ce qui concerne le code de production, je ne voudrais pas les variables locales annuler la définition partie d'une solution -. Hash calée serait probablement mieux 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"

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

Dans l'esprit de la question, vous pouvez limiter la variable à un champ, en supposant que vous êtes d'accord avec d'autres variables locales étant bloquées à la même portée. Ceci est particulièrement utile si vous définissez quelque chose dans une classe et ne veulent pas la variable locale de rester autour de la déclaration de classe.

La seule façon que je peux penser à le faire est avec Integer#times ou Array#each comme ceci:

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

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

Il y a probablement d'autres moyens encore plus propres pour limiter à un bloc outre. Ce ne sont pas aussi propre que je voudrais et j'aimerais voir si quelqu'un a une méthode plus propre à utiliser pour le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top