--TpRYXWn06PLgOJWtlsh
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Point taken!

On Fri, 2006-05-05 at 05:14 +0900, Wilson Bilkovich wrote:

> >ruby eval_bench.rb
>                 user     system      total        real
> eval:       1.141000   0.000000   1.141000 (  1.156000)
> const_get:  0.156000   0.000000   0.156000 (  0.172000)
> 
> >cat eval_bench.rb
> require 'benchmark'
> class Foo;end
> some_class  Foo'
> Benchmark.bm(10) do |b|
>   b.report("eval:") { 100000.times {eval("#{some_class}.new")} }
>   b.report("const_get:") { 100000.times{Object.const_get(some_class).new} }
> end
> 
> On 5/4/06, Charlie Bowman <charlie / castlebranch.com> wrote:
> > I understand the ugliness of eval....but why shouldn't we use it?  It is
> > much quicker to write, shorter to read, and easier to use.
> >
> > On Fri, 2006-05-05 at 04:19 +0900, Patrick Hurley wrote:
> >
> > > On 5/4/06, Patrick Hurley <phurley / gmail.com> wrote:
> > > > On 5/4/06, Gregory Seidman <gsslist+ruby / anthropohedron.net> wrote:
> > > > > On Fri, May 05, 2006 at 03:51:39AM +0900, RGR wrote:
> > > > > } I want to create an object from a class, but the name of that class is
> > > > > } in a variable, so the form objss.new(args) can't be used. How can it
> > > > > } be done? Without using eval, because its a bit messy and unelegant.
> > > > > }
> > > > > } The equivalent of objariable_with_class_name(args) in php.
> > > > >
> > > > > obj  bject::const_get(class_name).new(args)
> > > > >
> > > > > } Thanks.
> > > > > } RGR
> > > > > --Greg
> > > > >
> > > > >
> > > > >
> > > >
> > > > And if args is an array you want to use as individual params:
> > > >
> > > > obj  odule.const_get(class_name).new(*args)
> > > >
> > > > (note I prefer Module. but both work)
> > > > pth
> > > >
> > >
> > > Ara is of course correct, so you end up with something like:
> > >
> > > klass  ar_with_class.to_s.split('::').inject(Module) { |base,klass|
> > > base.const_get(klass) }
> > > obj  lass.new(*args)
> > >
> > > If this is a common operation in your code, you could add this into
> > > Module or some other reasonable place.
> > >
> > > pth
> > >
> > >
> >
> >
> >
> >
> 
> 



--TpRYXWn06PLgOJWtlsh--