From: Jim Menard <jimm / eris.io.com> Subject: [ruby-talk:9199] Class from name of class Date: Fri, 12 Jan 2001 23:10:02 +0900 > I have a class name in a string, and I want to create an instance of that > class. Can I do so without using eval? I'm looking for something like > Java's "Class.forName(className)" or Smalltalk's "Smalltalk classNamed: > className". > > I am trying to build a Web page that can list objects of multiple classes. > One CGI parameter is the class name. This code violates mod_ruby security > policy: > > className = cgi['class_name'][0] > var = eval "#{className}.instance()" # it's a singleton, thus instance() > require className If you already know what class you may instantiate, you can use Hash of Classes indexed by their names. ClassTable = {'Foo' => Foo, 'Bar' => Bar} className = cgi['class_name'][0] ClassTable[className].instance() Well, it is not as powerful as "Class.forName(className)" thing (I do not know Java), but it give you fine grained control over what can be done by users (probably good thing for a CGI script). ClassTable can be constructed from some kind of config file or automatically generate by some reflection feature. Following example assume all classes used this way are subclass of Base. class Base def Base.inherited(sub) ClassTable[sub.name] = sub end end class Foo < Base ... end Kenichi Komiya.