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拡張がされないのは、使われないからですかね?もしくは、他に何か意味があるのでしょうか。

環境

ruby ruby 1.8.6 (2010-02-05 patchlevel 399) [i686-linux]
Rails 2.3.11