Не определите переменную в Ruby

Скажем, я использую irb, и введите a = 5. Как я удаляю определение a так, чтобы ввод a возвраты a NameError?

Некоторый контекст: позже я хочу сделать это:

context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a'  # though this doesn't work.
47
задан Andrew Grimm 17 January 2012 в 21:09
поделиться

3 ответа

Существуют методы remove_class_variable, remove_instance_variable и remove_const, но в настоящее время нет эквивалента для локальных переменных.

47
ответ дан 26 November 2019 в 19:41
поделиться
[

] В настоящее время у вас нет смысла удалять глобальные, локальные переменные и переменные класса. Удалить константы можно с помощью метода "remove_const", однако[

].
0
ответ дан 26 November 2019 в 19:41
поделиться

Вы всегда можете "очистить" реестр irb от локальных переменных, вызвав подпрограмму irb. Вспомните, как оболочки Bash работают с неэкспортированными переменными окружения. Поскольку вы упомянули интерактивный режим, это решение должно работать и для него.

Что касается производственного кода, я бы не хотел неопределять локальные переменные как часть решения - хэши с ключами, вероятно, лучше подходят для такого типа сценария.

Вот что я имею в виду:

$ 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"
13
ответ дан 26 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: