From: Wilson Bilkovich Date: 2006-10-30T14:24:28+09:00 Subject: Re: how to reset and how to undefine a class On 10/30/06, Adriano Mitre wrote: > Does any one know how to reset a class in Ruby? Subsequent class > definitions don't replace the original, but are tipically appended to > it. > > The following example is typical. > > ######################### > class Song > def play > puts "playing..." > end > end > > s = Song.new > > class Song > def stop > puts "stopped." > end > end > > s.play #=> "playing..." > s.stop #=> "stopped." > ######################### > > How can I make s.stop produce a NoMethodError, ie., how can I reset Song > class prior to redefining it? > > Besides, I would like to know how to undefine Song class, so that > Song.new produce a NameError, i.e., behaving as if it were never > defined. > The first question is (a little) straightforward, once you get a handle on how open Ruby's classes are. To remove the 'stop' method, 'reopen' the class as you did when adding 'stop' in the first place: class Song undef stop end Removing the whole 'Song' constant is a little weirder. There is a remove_const method, but you have to call it on the thing that contains the constant you want to remove. In this case, the thing above Song is Object. Object.send(:remove_const, :Song) Sorry for my poor explanation. Hopefully you won't need to do this very often. I never have. Heh.