Anything better than klass = eval("#{task_class}")

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to convert a string containing a class name to a constant of that class name... Excepted rails way : task_class.camelize.constantize which is verbose too...

=> String

-greg

···

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose too...

Object.const_get("String")

--
BOOK: http://rubybestpractices.com
TECH: http://blog.majesticseacreature.com
NON-TECH: http://metametta.blogspot.com

Or dealing with things like Admin::User or Net::HTTP

   # from Jim Weirich (based on email correspondence)
   def constantize(camel_cased_word)
     camel_cased_word.
       sub(/^::/,'').
       split("::").
       inject(Object) { |scope, name| scope.const_get(name) }
   end

It may be more verbose, but it is much safer that plain 'ole eval()

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> > wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose too...

Object.const_get("String")

=> String

-greg

--
BOOK: http://rubybestpractices.com
TECH: http://blog.majesticseacreature.com
NON-TECH: http://metametta.blogspot.com

Actually, I don't think this is entirely right, since const_get will find
constants found in outer scopes.

For example constantize("MyModule::Object") would return ::Object

So a little better would be:

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

···

On Wed, Apr 1, 2009 at 10:47 AM, Rob Biedenharn <Rob@agileconsultingllc.com>wrote:

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to
convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose
too...

Object.const_get("String")

=> String

-greg

--
BOOK: http://rubybestpractices.com
TECH: http://blog.majesticseacreature.com
NON-TECH: http://metametta.blogspot.com

Or dealing with things like Admin::User or Net::HTTP

# from Jim Weirich (based on email correspondence)
def constantize(camel_cased_word)
   camel_cased_word.
     sub(/^::/,'').
     split("::").
     inject(Object) { |scope, name| scope.const_get(name) }
end

It may be more verbose, but it is much safer that plain 'ole eval()

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

Okay, so nothing less verbose :wink: But thanks for all the answers...

···

le 01/04/2009 16:47, Rob Biedenharn nous a dit:

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> >> wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose too...

Object.const_get("String")

=> String

Or dealing with things like Admin::User or Net::HTTP

   # from Jim Weirich (based on email correspondence)
   def constantize(camel_cased_word)
     camel_cased_word.
       sub(/^::/,'').
       split("::").
       inject(Object) { |scope, name| scope.const_get(name) }
   end

It may be more verbose, but it is much safer that plain 'ole eval()

The const_missing handling is a nice touch. I'm pinching this :slight_smile:

···

On Wed, Apr 1, 2009 at 5:09 PM, Rick DeNatale <rick.denatale@gmail.com> wrote:

Actually, I don't think this is entirely right, since const_get will find
constants found in outer scopes.

For example constantize("MyModule::Object") would return ::Object

So a little better would be:

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

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to
convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose
too...

Object.const_get("String")

=> String

-greg

--
BOOK: http://rubybestpractices.com
TECH: http://blog.majesticseacreature.com
NON-TECH: http://metametta.blogspot.com

Or dealing with things like Admin::User or Net::HTTP

# from Jim Weirich (based on email correspondence)
def constantize(camel_cased_word)
  camel_cased_word.
    sub(/^::/,'').
    split("::").
    inject(Object) { |scope, name| scope.const_get(name) }
end

It may be more verbose, but it is much safer that plain 'ole eval()

Actually, I don't think this is entirely right, since const_get will find
constants found in outer scopes.

For example constantize("MyModule::Object") would return ::Object

So a little better would be:

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

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

  # from Jim Weirich (based on email correspondence)

?> def constantize(camel_cased_word)

      camel_cased_word.

?> sub(/^::/,'').
?> split("::").
?> inject(Object) { |scope, name| scope.const_get(name) }

    end

=> nil

constantize("MyModule::Object")

NameError: uninitialized constant MyModule
  from (irb):6:in `const_get'
  from (irb):6:in `constantize'
  from (irb):8:in `inject'
  from (irb):3:in `each'
  from (irb):3:in `inject'
  from (irb):3:in `constantize'
  from (irb):8

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

=> nil

constantize("MyModule::Object")

NameError: uninitialized constant MyModule
  from (irb):14:in `constantize'
  from (irb):16:in `inject'
  from (irb):11:in `each'
  from (irb):11:in `inject'
  from (irb):11:in `constantize'
  from (irb):16

Except for the slight difference in the backtrace, it looks the same to me. Why do you think it will return Object for constantize("MyModule::Object") ?

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Apr 1, 2009, at 12:09 PM, Rick DeNatale wrote:

On Wed, Apr 1, 2009 at 10:47 AM, Rob Biedenharn > <Rob@agileconsultingllc.com>wrote:

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:
On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> >> wrote:

  from :0

But all of the mentioned suggestions are much better than
eval("ConstantName") in security, performance, and general design.
So if you want something less verbose, just make a method like
C("Whatever") that uses one of those implementations, rather than
forcing Ruby to fire up its parser via eval() just to get a constant.

···

On Thu, Apr 2, 2009 at 2:30 AM, Paganoni <noway@fakenullvoid.com> wrote:

le 01/04/2009 16:47, Rob Biedenharn nous a dit:

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to
convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose
too...

Object.const_get("String")

=> String

Or dealing with things like Admin::User or Net::HTTP

# from Jim Weirich (based on email correspondence)
def constantize(camel_cased_word)
camel_cased_word.
sub(/^::/,'').
split("::").
inject(Object) { |scope, name| scope.const_get(name) }
end

It may be more verbose, but it is much safer that plain 'ole eval()

Okay, so nothing less verbose :wink: But thanks for all the answers...

Because it does, if MyModule is actually defined and doesn't define another
inner constant called Object:

def constantize(camel_cased_word)
  camel_cased_word.

  sub(/^::/,'').
  split("::").
  inject(Object) { |scope, name| scope.const_get(name) }
end

module MyModule
end

constantize("MyModule::Object") # => Object

···

On Wed, Apr 1, 2009 at 12:37 PM, Rob Biedenharn <Rob@agileconsultingllc.com>wrote:

On Apr 1, 2009, at 12:09 PM, Rick DeNatale wrote:

On Wed, Apr 1, 2009 at 10:47 AM, Rob Biedenharn >> <Rob@agileconsultingllc.com>wrote:

On Apr 1, 2009, at 9:32 AM, Gregory Brown wrote:

On Wed, Apr 1, 2009 at 9:14 AM, Paganoni <noway@fakenullvoid.com> wrote:

Hi, well subject is self explanatory...

Seems a bit to verbose for me but I don't know any other solution to
convert
a string containing a class name to a constant of that class name...
Excepted rails way : task_class.camelize.constantize which is verbose
too...

Object.const_get("String")

=> String

-greg

--
BOOK: http://rubybestpractices.com
TECH: http://blog.majesticseacreature.com
NON-TECH: http://metametta.blogspot.com

Or dealing with things like Admin::User or Net::HTTP

# from Jim Weirich (based on email correspondence)
def constantize(camel_cased_word)
camel_cased_word.
   sub(/^::/,'').
   split("::").
   inject(Object) { |scope, name| scope.const_get(name) }
end

It may be more verbose, but it is much safer that plain 'ole eval()

Actually, I don't think this is entirely right, since const_get will find
constants found in outer scopes.

For example constantize("MyModule::Object") would return ::Object

So a little better would be:

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

Except for the slight difference in the backtrace, it looks the same to

me. Why do you think it will return Object for
constantize("MyModule::Object") ?

Ah, I see now. Thanks for the improvement, Rick!

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob@AgileConsultingLLC.com

···

On Apr 1, 2009, at 2:24 PM, Rick DeNatale wrote:

Because it does, if MyModule is actually defined and doesn't define another
inner constant called Object: