Using a string to find a class


#1

I’ve got a string, and I want to find out if there’s a class with that
name. So something like

class_exists? “Foo”

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there’s a class with that name or not.

Thanks,
Pat


#2

Hi Pat

This ones come up a few times on the list

http://www.ruby-forum.com/topic/66482#80672

is one that I remember particulalry.

Although in some methods that I have seen in the rails source there has
been

string_name.camelize.constantize

This will return a class object specified by name.
eg

def do_somthing( class_name )
obj = class_name.to_s.camelize.constantize
obj.new
end

Hope this works for you


#3

Pat M. wrote:

I’ve got a string, and I want to find out if there’s a class with that
name. So something like

class_exists? “Foo”

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there’s a class with that name or not.

module.const_get “Foo”

or just

const_get “Foo”

Cheers,
Dave


#4

Dave B. wrote:

module.const_get “Foo”

or just

const_get “Foo”

You’ll get an exception if Foo isn’t defined.

And not every constant refers to a class you can instantiate:

class Bar ; end
kls = Object.const_get “Bar”
c = kls.new() # OK

Foo = 12
kls = Object.const_get “Foo”
c = kls.new() # Not so OK

Quick version:

def class_exists? kls
begin
kls = Object.const_get kls
kls.kind_of? Class
rescue Exception
false
end
end

def new_if_class kls, default = nil
class_exists?( kls ) ? Object.const_get( kls ).new : default
end

b = new_if_class “Bar”
p b

c = new_if_class “Foo”
p c


James B.

“Take eloquence and wring its neck.”

  • Paul Verlaine

#5

On Thu, Jun 08, 2006 at 11:38:42AM +0900, Daniel N wrote:
[…]
} Although in some methods that I have seen in the rails source there
has been
}
} string_name.camelize.constantize
}
} This will return a class object specified by name.
} eg
}
} def do_somthing( class_name )
} obj = class_name.to_s.camelize.constantize
} obj.new
} end

Both #camelize and #constantize are Rails extensions.

} Hope this works for you
–Greg

} On 6/8/06, Pat M. removed_email_address@domain.invalid wrote:
} >I’ve got a string, and I want to find out if there’s a class with
that
} >name. So something like
} >
} >class_exists? “Foo”
} >
} >and then I can eval it if it does, I guess. Or is there a better way
} >than eval in that case? At any rate, I just want to be able to take
a
} >string and find out if there’s a class with that name or not.
} >
} >Thanks,
} >Pat
} >
} >
}
}


#6

On Thu, Jun 08, 2006 at 11:26:21AM +0900, Pat M. wrote:
} I’ve got a string, and I want to find out if there’s a class with that
} name. So something like
}
} class_exists? “Foo”
}
} and then I can eval it if it does, I guess. Or is there a better way
} than eval in that case? At any rate, I just want to be able to take a
} string and find out if there’s a class with that name or not.

http://redcorundum.blogspot.com/2006/05/kernelqualifiedconstget.html

} Thanks,
} Pat
–Greg


#7

Use Facets’ kernel/constant

constant(name)

or string/to_const

name.to_const

http:://facets.rubyforge.org

T.