How to check if a class already exists in Ruby
How do I check if a class already exists in Ruby?
My code is:
puts "enter the name of the Class to see if it exists"
nameofclass=gets.chomp
eval (" #{nameofclass}...... Not sure what to write here")
I was thinking of using:
eval "#{nameofclass}ancestors. ....."
You can use Module.const_get
to get the constant referred to by the string. It will return the constant (generally classes are referenced by constants). You can then check to see if the constant is a class.
I would do something along these lines:
def class_exists?(class_name)
klass = Module.const_get(class_name)
return klass.is_a?(Class)
rescue NameError
return false
end
Also, if possible I would always avoid using eval
when accepting user input; I doubt this is going to be used for any serious application, but worth being aware of the security risks.
perhaps you can do it with defined?
eg:
if defined?(MyClassName) == 'constant' && MyClassName.class == Class
puts "its a class"
end
Note: the Class check is required, for example:
Hello = 1
puts defined?(Hello) == 'constant' # returns true
To answer the original question:
puts "enter the name of the Class to see if it exists"
nameofclass=gets.chomp
eval("defined?(#{nameofclass}) == 'constant' and #{nameofclass}.class == Class")
You can avoid having to rescue the NameError from Module.const_get
if you are looking the constant within a certain scope by calling Module#const_defined?("SomeClass")
.
A common scope to call this would be Object, eg: Object.const_defined?("User")
.
See: "Module".