Wilson Bilkovich
10/30/2006 5:24:00 AM
On 10/30/06, Adriano Mitre <adriano.mitre@gmail.com> 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.