Domanda

Diciamo che sto utilizzando irb e digitare a = 5. Come posso rimuovere la definizione di a in modo che digitando a restituisce un NameError?

Alcuni contesto: dopo mi voglio fare questo:

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

Soluzione

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

Altri suggerimenti

È possibile evitare un-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

Si può sempre registro 'chiaro' di IRB delle variabili locali invocando una subshell IRB. Pensate a come conchiglie Bash funzionano rispetto alle variabili di ambiente non esportate. Dal momento che si metioned modalità interattiva, questa soluzione dovrebbe lavorare per questo.

Per quanto riguarda il codice di produzione, non vorrei ridefinisca variabili locali come parte di una soluzione -. Digitato hash probabilmente sarebbe meglio per questo tipo di scenario

Ecco cosa voglio 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"

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

Nello spirito della questione, si potrebbe limitare la variabile a un ambito, supponendo che si sono daccordo con le altre variabili locali di essere bloccate per lo stesso ambito. Ciò è utile soprattutto se si definisce qualcosa in una classe e non si desidera che la variabile locale di rimanere in giro per la dichiarazione della classe.

Gli unici modi che posso pensare di fare questo è con Integer#times o Array#each in questo modo:

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

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

Probabilmente ci sono altri modi, anche più pulite per limitare ad un blocco oltre a questo. Questi non sono pulite come vorrei e mi piacerebbe vedere se qualcuno ha un metodo più pulito da utilizzare per fare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top