Подтвердить что ты не робот

Неопределенная переменная в Ruby

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

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

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

Ответ 2

Вы можете избежать отказа от объявления переменной, уменьшив область видимости переменной:

def scope 
  yield
end

scope do 
  b = 1234
end

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

Ответ 3

Вы всегда можете "очистить" регистрацию локальных переменных 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"

Ответ 4

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