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.
Thanks!
--
Posted via http://www.ruby-forum.com/.
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.
> 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.
You can redefine a class entirely by giving it a new subclass.
class Song < Object
end
T.
s/subclass/superclass/
T.
I don't get it:
class SomeClass < String
def ameth(a)
p a
end
end
class SomeClass < Object
end
SomeClass.new.ameth(10)
:w !ruby
-:7: superclass mismatch for class SomeClass (TypeError)
--
Ross Bamford - ro...@roscopeco.REMOVE.co.uk
Hmph.... Looks like Ruby changed this at some point. It used to be able
to do that.
T.
All class definitions are constants in the Object class. So by doing
the following:
class Song
end
class Object
remove_const :Song
end
Song.new
NameError: uninitialized constant Song
classes can be undefined. You could also alternatively say:
Object.send(:remove_const, :Song)
I want to remove ("undef") all methods, no only a single one. That is
what I meant with "reset a class".
> 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.
It is not exactly elegant, but indeed I think I won't need it often. I
am inclined to using the "Object.send(:remove_const, :classname)"
solution in both cases, reset and undef.
Thank you very much.