Aaron_T
February 28, 2008, 6:31pm
1
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
Aaron_T
February 28, 2008, 6:42pm
2
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
Aaron_T
February 28, 2008, 6:49pm
3
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
Aaron_T
February 29, 2008, 12:52am
4
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
Aaron_T
February 29, 2008, 1:42am
5
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]
Aaron_T
February 29, 2008, 1:18am
6
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.