RubyのクラスはClassクラスのインスタンスらしい。なるほど。
つまり、以下のようにABCクラスを作るとClassクラスのインスタンスが生成されるらしい。
Class ABC end ABC.class => Class
そして、クラス名は定数なのだそうだ。上の場合だと”ABC”は定数でもあるらしい(だから、クラス名の最初は大文字)。Classクラスのインスタンスを定数ABCに代入しているということらしい。
上でクラスの作成は以下のように書くこともできる。
ABC = Class.new{ }
より定数に代入しているっぽいですね。
ならば、このクラス名の定数”ABC”はどこのクラスで定義されているのだろうかと。
ちょっと調べたら簡単にわかりました。以下のようにObjectクラスの定数としてクラス名は定義されているようです。
p Object.constants.grep /ABC/ ⇒ ["ABC"]
Rubyのその他の組み込みクラスのクラス名もObjectクラスに定数として定義されています。さきほど私が定義したクラス名ABCも含めて。
p Object.constants => ["ThreadError", "RUBY_PLATFORM", "Regexp", "Deprecate", "Numeric", "String", "SLex", "Bignum", "IndexError", "SecurityError", "UnboundMethod", "Exception", "Readline", "RubyLex", "NoMethodError", "FALSE", "Object", "RELEASE_DATE", "IRB", "Range", "IO", "Integer", "Config", "TypeError", "RubyToken", "Dir", "RUBY_VERSION", "ZeroDivisionError", "Gem", "SystemExit", "NotImplementedError", "Hash", "RegexpError", "Kernel", "TOPLEVEL_BINDING", "RUBY_COPYRIGHT", "GC", "TRUE", "STDOUT", "LocalJumpError", "Binding", "Interrupt", "RUBY_FRAMEWORK", "ObjectSpace", "SyntaxError", "Marshal", "Enumerable", "Struct", "Class", "Continuation", "IOError", "MAXHISTSIZE", "RangeError", "Kconv", "Data", "Thread", "RUBY_PATCHLEVEL", "SystemStackError", "Array", "NoMemoryError", "FileTest", "MatchData", "ARGF", "ETC_IRBRC_LOADED", "NIL", "Comparable", "PLATFORM", "ArgumentError", "Float", "FloatDomainError", "RUBY_RELEASE_DATE", "RuntimeError", "Precision", "ThreadGroup", "Signal", "Fixnum", "STDERR", "FalseClass", "VERSION", "Exception2MessageMapper", "RbConfig", "Errno", "StandardError", "Math", "EOFError", "LoadError", "NKF", "RUBY_FRAMEWORK_VERSION", "APPLE_GEM_HOME", "STDIN", "TrueClass", "NameError", "NilClass", "Process", "Proc", "RUBY_DESCRIPTION", "ARGV", "ABC", "SystemCallError", "SignalException", "MatchingData", "File", "Time", "ENV", "ScriptError", "Symbol", "Module", "Method", "StopIteration", "DTracer", "CROSS_COMPILING", "HISTFILE"]
なるほど。なるほど。なるほど。