how to reset and how to undefine a class

A

Adriano Mitre

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.

Thanks!
 
W

Wilson Bilkovich

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.
 
T

Trans

Adriano said:
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.
 
R

Ross Bamford

s/subclass/superclass/

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)
 
T

Trans

Ross said:
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)

Hmph.... Looks like Ruby changed this at some point. It used to be able
to do that.

T.
 
D

Dido Sevilla

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.

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)
 
A

Adriano Mitre

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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top