tags:

views:

249

answers:

3

Let's say I'm using irb, and type a = 5. How do I remove the definition of a so that typing a returns a NameError?

Some context: later I want to do this:

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

Currently you have no mean to remove global variables, local variables and class variables. You can remove constants using "remove_const" method though

Nakul
Not true for class variables - there is remove_class_variable.
mikej
oh! thanks mikej. didn't know that :)
Nakul
+2  A: 

There are remove_class_variable, remove_instance_variable and remove_const methods but there is currently no equivalent for local variables.

mikej
hmm, annoying that there aren't any methods like that. I guess I can stick to instance variables for now.
Peter
+1  A: 

You can always 'clear' irb's registry of local variables by invoking an irb subshell. Think of how Bash shells work with respect to unexported environment variables. Since you metioned interactive mode, this solution ought to work for that.

As far as production code, I wouldn't want to undefine local variables as part of a solution - keyed hashes would probably be better for that type of scenario.

Here's what I mean:

$ 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"
Dean Radcliffe