Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I check if a class is defined?

How do I turn a string into a class name, but only if that class already exists?

If Amber is already a class, I can get from a string to the class via:

Object.const_get("Amber") 

or (in Rails)

"Amber".constantize 

But either of these will fail with NameError: uninitialized constant Amber if Amber is not already a class.

My first thought is to use the defined? method, but it doesn't discriminate between classes that already exist and those that don't:

>> defined?("Object".constantize) => "method" >> defined?("AClassNameThatCouldNotPossiblyExist".constantize) => "method" 

So how do I test if a string names a class before I try to convert it? (Okay, how about a begin/rescue block to catch NameError errors? Too ugly? I agree...)

like image 559
fearless_fool Avatar asked Apr 22 '11 18:04

fearless_fool


People also ask

How to check if class is present in java?

We can check for the existence of a class using Java Reflection, specifically Class. forName(). The documentation shows that a ClassNotFoundException will be thrown if the class cannot be located.


2 Answers

How about const_defined??

Remember in Rails, there is auto-loading in development mode, so it can be tricky when you are testing it out:

>> Object.const_defined?('Account') => false >> Account => Account(id: integer, username: string, google_api_key: string, created_at: datetime, updated_at: datetime, is_active: boolean, randomize_search_results: boolean, contact_url: string, hide_featured_results: boolean, paginate_search_results: boolean) >> Object.const_defined?('Account') => true 
like image 151
ctcherry Avatar answered Sep 28 '22 14:09

ctcherry


In rails it's really easy:

amber = "Amber".constantize rescue nil if amber # nil result in false     # your code here end 
like image 22
Eiji Avatar answered Sep 28 '22 15:09

Eiji