------art_36888_14379105.1144613177495
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

On 4/9/06, Logan Capaldo <logancapaldo / gmail.com> wrote:
>
>
> On Apr 9, 2006, at 3:21 PM, Robert Dober wrote:
>
> > On 4/9/06, Brian Parkinson <parkI / whatevernot.com> wrote:
> >>
> >> Sven Klemm wrote:
> >>
> >> [deletia]
> >>
> >>> Module.const_get(s).new
> >>
> >> Thanks!
> >>
> >> I knew it would be a one-liner. :-)
> >>
> >> parki...
> >
> >
> > I am afraid that the only  one-liner is eval :(
> >
> > suppose s contains the name of your class
> > Module.const_get s does not work unless your class is defined on
> > top level.
> > In oder to have the *same* semantics as
> >
> >    eval(s).new
> >
> > we have to write
> >
> > m = Module
> > s.split(%r{::|\.}).each do
> >     |name|
> >     m = m.const_get(name)
> > end
> > m.new
> >
> > I suggest to look at ObjectSpace for another alternative, hardly more
> > efficent though :(
> >
> > Robert
> >
> >
> > --
> > Deux choses sont infinies : l'univers et la bóŐise humaine ; en ce qui
> > concerne l'univers, je n'en ai pas acquis la certitude absolue.
> >
> > - Albert Einstein
>
> s.split(/::/).inject(Object) { |p, c| p.const_get(c) }.new
>
> There, a one liner (w/o any semi-colons)
>
>
> Yup, very nice

What I meant though is that eval seems much simpler and cheaper
Let us see
yet your's is fine, just look at the mess when searching through ObjectSpace

cat perf.rb; ruby perf.rb
require 'benchmark'

module One
  class Two
    class Three
    end
  end
end
s="One::Two::Three"
n = 50000
Benchmark.bm do |x|
  x.report("eval       "){ n.times{ eval(s).new } }
  x.report("split      ") { n.times{ s.split(/::/).inject(Object) { |p, c|
p.const_get(c) }.new } }
  x.report("ObjectSpace"){n.times{x=nil;ObjectSpace.each_object(Class){|cls|
x=cls if
cls.to_s == s};x.new } }
end      user     system      total        real
eval         0.280000   0.000000   0.280000 (  0.372346)
split        0.540000   0.000000   0.540000 (  0.621870)
ObjectSpace 21.920000   0.070000  21.990000 ( 24.452318)


--
Deux choses sont infinies : l'univers et la bóŐise humaine ; en ce qui
concerne l'univers, je n'en ai pas acquis la certitude absolue.

- Albert Einstein

------art_36888_14379105.1144613177495--