String to Class?

I want to be able to take a class name stored in a variable as a string
like:

foo = “Foo::Bar”

and convert that to the class Foo::Bar so that I can call .new(), etc:

obj = foo.new

I know I can just do:

foo = Foo::Bar

but that doesn’t solve my problem which is to accept the class name as
an argument on the command line from the user.

Thanks,
Aaron

On Thu, Feb 28, 2008 at 11:28 AM, Aaron T. [email protected]
wrote:

foo = Foo::Bar
http://tcpreplay.synfin.net/ - Pcap editing & replay tools for Unix
They that can give up essential liberty to obtain a little temporary
safety deserve neither liberty nor safety. – Benjamin Franklin

I’m sure there’s a better way, but:

module Foo
class Bar

end
end

foo = “Foo::Bar”
foo = foo.split(“::”).inject(Object){|s,v| s.const_get(v) }

obj = foo.new

p obj

Alle Thursday 28 February 2008, Aaron T. ha scritto:

foo = Foo::Bar

but that doesn’t solve my problem which is to accept the class name as
an argument on the command line from the user.

Thanks,
Aaron

foo.split(’::’).inject(Kernel){|res, i| res.const_get(i)}

Stefano

Stefano C. wrote:

foo.split(’::’).inject(Kernel){|res, i| res.const_get(i)}

Stefano

Gordon, Stefano,

That is a SUPER cool form of inject()! I usually just use is as a
builder for a hash or other container type, but having inject using
something fairly different on each iteration is grand! Why didn’t I
think of that???!!!

Great tip, thanks again

ilan

cool~ I haven’t thought it before.

Rails have its owner ext for this function classed
Inflector.constantize.
And it’s implementation is used module_eval.
So it can also be :

obj = Object.module_eval(foo).new

On Fri, Feb 29, 2008 at 1:47 AM, Stefano C.
[email protected]

On Feb 28, 2008, at 12:47 PM, Stefano C. wrote:

foo.split(’::’).inject(Kernel){|res, i| res.const_get(i)}

That is the coolest thing i have ever seen. Seriously. It will take a
lot of awesome to beat this!

+1

_______________________________|

  • Ari
    I just bought another case of RockStar. Expect architectural changes.