From: Robert Evans Date: 2005-11-15T08:07:34+09:00 Subject: Re: removing a constant definition from an environment Thanks for all responses. I think I can work something out based on these. I'll post my answer. Bob On Nov 14, 2005, at 2:25 PM, Ryan Leavengood wrote: > On 11/14/05, Robert Evans wrote: >> Hi Ryan, >> >> Thanks for your help. >> >> I tried that, and it didn't work. Here is my irb transcript trying >> that. Is there another way to remove a constant? I thought I had seen >> one in the Pickaxe book, but maybe I was thinking of the module >> method. >> >> irb >> irb(main):001:0> FOO = "my symbol value" >> => "my symbol value" >> irb(main):002:0> remove_const(FOO) >> NoMethodError: undefined method `remove_const' for main:Object >> from (irb):2 >> irb(main):003:0> remove_const(:FOO) >> NoMethodError: undefined method `remove_const' for main:Object >> from (irb):3 >> irb(main):004:0> ?? >> >> >> Any other ideas? > > This is one of those odd methods that is hard to call. It is actually > a private method in Module, which means you must call it on a module > or class, and because it is private you must use send if you want to > call it from outside the class or module: > > irb(main):001:0> FOO = "something" > => "something" > irb(main):002:0> Object.const_defined?(:FOO) > => true > irb(main):003:0> Object.send(:remove_const, :FOO) > => "something" > irb(main):004:0> FOO > NameError: uninitialized constant FOO > from (irb):4 > > But it is better to do something like this: > > irb(main):005:0> class Test > irb(main):006:1> FOO = "something" > irb(main):007:1> end > => "something" > irb(main):008:0> class Test > irb(main):009:1> FOO = "something else" > irb(main):010:1> end > (irb):9: warning: already initialized constant FOO > => "something else" > irb(main):011:0> class Test > irb(main):012:1> remove_const(:FOO) > irb(main):013:1> FOO = "yet something else" > irb(main):014:1> end > => "yet something else" > > In other words you should call remove_const from inside the class > definition before re-creating it. > > Ryan >