Symbolでconstantize
Rails の active_support/core_ext/string/inflections.rb で Ruby の String が拡張されて constantize が使えて便利です。
% script/console Loading development environment (Rails 2.3.11) >> "Hash".constantize => Hash >> :Hash.constantize NoMethodError: undefined method `constantize' for :Hash:Symbol from (irb):2
constantize を Symbol で使いたいと思い、検索していたら こちらのページを発見しました。以下のように実現しています。
class Symbol def constantize self.to_s.camelize.constantize end end
使ってみます。
% script/console Loading development environment (Rails 2.3.11) >> class Symbol >> def constantize >> self.to_s.camelize.constantize >> end >> end => nil >> >> :Hash.constantize => Hash >> :hash.constantize => Hash
たしかに出来ますが、camelize は仕事しすぎなのかなと思いました。 String拡張の constantize には「It raises a NameError when the name is not in CamelCase」と記述があるように、"hash".constantize をサポートしていませんし。
154 # +constantize+ tries to find a declared constant with the name specified 155 # in the string. It raises a NameError when the name is not in CamelCase 156 # or is not initialized. 157 # 158 # Examples 159 # "Module".constantize # => Module 160 # "Class".constantize # => Class 161 def constantize 162 Inflector.constantize(self) 163 end
なので、camelize は外しました。duck typingをイメージしています。
class Symbol def constantize self.to_s.constantize end end
使ってみます。
% script/console Loading development environment (Rails 2.3.11) >> class Symbol >> def constantize >> self.to_s.constantize >> end >> end => nil >> >> :Hash.constantize => Hash >> :hash.constantize NameError: wrong constant name hash from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/inflector.rb:364:in `const_defined?' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/inflector.rb:364:in `constantize' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/inflector.rb:363:in `each' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/inflector.rb:363:in `constantize' from /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.11/lib/active_support/core_ext/string/inflections.rb:162:in `constantize' from (irb):3:in `constantize' from (irb):8
Symbolにconstantize拡張がされないのは、使われないからですかね?もしくは、他に何か意味があるのでしょうか。