Undefine variable in Ruby

后端 未结 5 1255
迷失自我
迷失自我 2020-12-05 06:29

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

相关标签:
5条回答
  • 2020-12-05 06:46

    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"
    
    0 讨论(0)
  • 2020-12-05 06:50

    You can avoid un-declaring the variable by reducing the scope in which the variable exists:

    def scope 
      yield
    end
    
    scope do 
      b = 1234
    end
    
    b  # undefined local variable or method `b' for main:Object
    
    0 讨论(0)
  • 2020-12-05 06:50

    In the spirit of the question, you could limit the variable to a scope, assuming you are okay with other local variables being locked to the same scope. This is useful particularly if you are defining something in a class and don't want the local variable to stay around in the class declaration.

    The only ways I can think to do this is with Integer#times or Array#each like so:

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

    There are probably other, even cleaner ways to limit to a block besides this. These aren't as clean as I'd like and I'd love to see if someone has a cleaner method to use to do this.

    0 讨论(0)
  • 2020-12-05 06:52

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

    0 讨论(0)
  • 2020-12-05 07:03

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

    0 讨论(0)
提交回复
热议问题