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…
On Wed, Apr 1, 2009 at 9:14 AM, Paganoni [email protected] 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
On Apr 1, 2009, at 9:32 AM, Gregory B. wrote:
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 W. (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 B. http://agileconsultingllc.com
[email protected]
On Wed, Apr 1, 2009 at 5:09 PM, Rick DeNatale [email protected]
wrote:
sub(/^::/,'').
split("::").
inject(Object) { |scope, name| scope.const_defined?(name) ?
scope.const_get(name) : scope.const_missing(name) }
end
The const_missing handling is a nice touch. I’m pinching this
On Wed, Apr 1, 2009 at 10:47 AM, Rob B.
[email protected]wrote:
too…
TECH: http://blog.majesticseacreature.com
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
On Apr 1, 2009, at 12:09 PM, Rick DeNatale wrote:
Seems a bit to verbose for me but I don’t know any other solution
Or dealing with things like Admin::User or Net::HTTP
camel_cased_word.
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
irb> # from Jim W. (based on email correspondence)
?> def constantize(camel_cased_word)
irb> camel_cased_word.
?> sub(/^::/,‘’).
?> split(“::”).
?> inject(Object) { |scope, name| scope.const_get(name) }
irb> end
=> nil
irb> 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
from :0
irb> def constantize(camel_cased_word)
irb> camel_cased_word.
?> sub(/^::/,‘’).
?> split(“::”).
?> inject(Object) { |scope, name| scope.const_defined?
(name) ? scope.const_get(name) : scope.const_missing(name) }
irb> end
=> nil
irb> 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
from :0
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 B. http://agileconsultingllc.com
[email protected]
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:
Ah, I see now. Thanks for the improvement, Rick!
-Rob
Rob B. http://agileconsultingllc.com
[email protected]
On Wed, Apr 1, 2009 at 12:37 PM, Rob B.
[email protected]wrote:
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”) ?
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
le 01/04/2009 16:47, Rob B. nous a dit:
verbose too…
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 But thanks for all the answers…
On Thu, Apr 2, 2009 at 2:30 AM, Paganoni [email protected] wrote:
a string containing a class name to a constant of that class name…
from Jim W. (based on email correspondence)
Okay, so nothing less verbose But thanks for all the answers…
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.