Dynamic Class Initialization

Hi all,
I know this can be done, but I can’t find out how to do it. I have a
string with the name of the class that I want to initialize, but how do
I do it?

This is what I tried,

class = “Product”
product = class.new

Obviously this does not work or I wouldn’t be asking :slight_smile: So, how do I do
this?

Peer

Hi Peer,

On Friday, June 15, 2007, at 04:36PM, “Peer A.”
[email protected] wrote:

Obviously this does not work or I wouldn’t be asking :slight_smile: So, how do I do
this?

Peer

Try this:

clazz = Object.const_get(“Product”)
product = clazz.new

The word class is a reserved word so yu should use something
different…

Cheers,

Enrique

On 15/06/07, Peer A. [email protected] wrote:

class = “Product”
product = class.new

class = “Product”
product = Object.const_get(class).new

Farrel

Thanks all. I knew this couldn’t be that difficult. I must have been
searching for the wrong thing.

Peer

On Jun 15, 2007, at 10:41 AM, Enrique Comba R. wrote:

This is what I tried,
Try this:

clazz = Object.const_get(“Product”)
product = clazz.new

The word class is a reserved word so yu should use something
different…

Cheers,

Enrique

from Jim W. (based on email correspondence)

def constantize(camel_cased_word)
camel_cased_word.
sub(/^::/,‘’).
split(“::”).
inject(Object) { |scope, name| scope.const_get(name) }
end

Actually, Jim answered this question twice, once directly and once in
a post to our local users group with nearly identical code, but
clearly typed in ad hoc both times.

If you need to deal with something like ActiveRecord::Base, the
simple form doesn’t work:

Object.const_get “ActiveRecord::Base”
NameError: wrong constant name ActiveRecord::Base
from (irb):1:in `const_get’
from (irb):1
“ActiveRecord::Base”.split(‘::’).inject(Object) {|scope,name|
scope.const_get(name)}
=> ActiveRecord::Base

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

Peer A. schrieb:

Obviously this does not work or I wouldn’t be asking :slight_smile: So, how do I do
this?

Peer

I suggest you use this method (out of Rails):

def constantize(camel_cased_word)
unless /^(::)?([A-Z]\w*)(::[A-Z]\w*)*$/ =~ camel_cased_word
raise NameError, “#{camel_cased_word.inspect} is not a valid
constant name!”
end

camel_cased_word = “::#{camel_cased_word}” unless $1
Object.module_eval(camel_cased_word, FILE, LINE)
end

It’s a bit more powerful than the built-in Ruby Version.

Peer A. wrote:

Hi all,
I know this can be done, but I can’t find out how to do it. I have a
string with the name of the class that I want to initialize, but how do
I do it?

This is what I tried,

class = “Product”
product = class.new

Obviously this does not work or I wouldn’t be asking :slight_smile: So, how do I do
this?

Peer
hello,may this can work :slight_smile:

product=eval(“Product”).new

Ryan D. schrieb:

ObjectSpace.each_object(Module) { |k| x << k if k.name =~ /^[a-z]/ }
=> 341

x
=> [fatal]

Using module_eval is dumb too. Use this instead:

full_name.split(/::/).inject(Object) { |klass, name| klass.const_get name }

Wow, okay. I didn’t know about that.
It’s never too late to learn something new :slight_smile:

On Jun 15, 2007, at 08:15 , Daniel K. wrote:

I suggest you use this method (out of Rails):

I suggest you don’t. It is more wrong than right. Example:

% irb

x = []
=> []

ObjectSpace.each_object(Module) { |k| x << k if k.name =~ /^[a-z]/ }
=> 341

x
=> [fatal]

Using module_eval is dumb too. Use this instead:

full_name.split(/::/).inject(Object) { |klass, name| klass.const_get
name }