Instantiate different class based on variable contents

S

stephen O'D

Lets say I have a two classes, Foo and Bar.

In some code, I have a variable that can either contain the test 'Foo'
or the text 'Bar'. If it contains Foo, I would like to call Foo.new
(v1, v2), if it contains Bar, I would like to call Bar.new(v1, v2).

Obviously I could create an IF statement, such as

if var == 'Foo' then
Foo.new(...)
elsif var == 'Bar' then
Bar.new(...)
end if

Or if I want to get fancy, maybe a dispatch table:

dispatch = {
'Foo' => Foo,
'Bar' => Bar
}

obj = dispatch[var].new(...)

Is there another Ruby way to do this sort of thing?

Thanks,

Stephen.
 
T

Tony Arcieri

[Note: parts of this message were removed to make it a legal post.]

dispatch = {
'Foo' => Foo,
'Bar' => Bar
}

obj = dispatch[var].new(...)

Is there another Ruby way to do this sort of thing?

Object.const_get(var).new(...)

or with ActiveSupport:

var.constantize.new(...)
 
G

Gary Wright

dispatch = {
'Foo' => Foo,
'Bar' => Bar
}

obj = dispatch[var].new(...)


This can sometimes be the best approach because if you simply
translate arbitrary text to a class name you are allowing arbitrary
classes to be instantiated. It just depends on where your text is
coming from.

Rick DeNatale recently posted in [ruby-talk:332670] this nice solution
to mapping text to class objects:
 
S

stephen O'D

dispatch = {
 'Foo' => Foo,
 'Bar' => Bar
}
obj = dispatch[var].new(...)

This can sometimes be the best approach because if you simply  
translate arbitrary text to a class name you are allowing arbitrary  
classes to be instantiated.  It just depends on where your text is  
coming from.

Rick DeNatale recently posted in [ruby-talk:332670] this nice solution  
to mapping text to class objects:
def constantize(camel_cased_word)
  camel_cased_word.
    sub(/^::/,'').
    split("::").
    inject(Object) { |scope, name| scope.const_defined?(name) ?
scope.const_get(name) : scope.const_missing(name) }
end

Thanks for the tip - I *think* my data is well enough sanitized, but
you just never know so I may well use this approach. Knowing how to
do things with Object.const_get is useful even if I don't use it.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,777
Messages
2,569,604
Members
45,228
Latest member
MikeMichal

Latest Threads

Top