Позвольте'ы сказать, что я'м, используя Эсо
, а типа A = 5
. Как убрать определение "а", так что введя а
возвращает NameError
?
Некоторые контексте: позже я хочу сделать это:
context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a' # though this doesn't work.
Есть remove_class_variable, remove_instance_variable и remove_const методы, но в настоящее время нет никакого эквивалента для локальных переменных.
Вы всегда можете 'понятно,' Сиб's в реестр локальных переменных, вызывая ЭК; подуровень. Вспомните, как в bash работать с точки зрения переменных неэкспортируется среды. Поскольку вы основных интерактивном режиме, это решение должно работать для этого.
Насколько это рабочий код, я бы'т хотите сбросить локальные переменные как часть решения - хэширование по ключу, вероятно, будет лучше для этого типа сценария.
Здесь's то, что я имею в виду:
$ 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"
В духе вопроса, Вы могли бы предел переменной сферы, предполагая, что вы хорошо с другими локальными переменными были заперты в той же области. Это полезно, особенно если вы чем-то определяющим в классе и Дон'т хотите, чтобы локальная переменная, чтобы остаться в объявлении класса.
Единственным способом я могу думать, чтобы сделать это с Целое число#раз
или массив#друг
вот так:
1.times do |a|
a = 5
# code…
end
[5].each do |a|
# code…
end
Вероятно, имеются и другие, еще почище, способы ограничения к блоку, кроме этого. Это'т так чисто, как я'd, как и я'd любовь, чтобы увидеть, если кто-то чище способ сделать это.