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 > > -- > 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 irb> # from Jim Weirich (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 Biedenharn http://agileconsultingllc.com Rob / AgileConsultingLLC.com