"George Ogata" <> schrieb im Newsbeitrag
news:...
> "DaZoner" <> writes:
>
> > I've defined a class I use that strips methods off of a class
(specified by
> > a string representing the class name). I use it maybe 30 times during
my
> > application run. However I'm concerned because it does an
> > ObjectSpace.each(Class) call to make sure the specified class exists
before
> > trying to remove any methods. Will this call get slow as a few arrays
> > containing perhaps a million FixNums get defined by the application in
> > between calls? The array's data stays around as the calls to my class
are
> > made. I've included the source of the class below. If anyone knows an
> > efficient way to determine if a class exists given its name in String
form
> > I'd sure appreciate seeing it.
> >
>
> Something like:
>
> Object.const_defined?(name) && Object.const_get(name).is_a?(Class)
>
> You'd need to tweak it a bit to support nested class names like
> C:
::E (in that case you'd need to call C:
.const_defined?('E'),
> e.g.).
For example like this:
module Kernel
private
# raises NameError if it's undefined
# raises TypeError if it's not a class
# returns the class instance otherwise
def get_class(class_name)
c = class_name.split(/:

\./).inject(Object) do |cl, name|
cl.const_get name
end
raise TypeError, "Not a class: #{class_name}" unless Class === c
c
end
end
>> get_class "String"
=> String
>> get_class "StringX"
NameError: uninitialized constant StringX
from (irb):27:in `const_get'
from (irb):27:in `get_class'
from (irb):26:in `inject'
from (irb):26:in `each'
from (irb):26:in `inject'
from (irb):26:in `get_class'
from (irb):35
>> get_class "File::Stat"
=> File::Stat
>> get_class "Enumerable"
TypeError: Not a class: Enumerable
from (irb):29:in `get_class'
from (irb):37
>>
You probable want to include modules as well. Just change to
raise TypeError, "Not a class: #{class_name}" unless Class === c ||
Module === c
>> get_class "Enumerable"
=> Enumerable
Regards
robert