クラスとモジュール

リテラルとクラス


1.class => Fixnum
0.5.class => Float
"hoge".class => String
'a'.class => String
:hoge.class => Symbol
["hoge1", "hoge2"].class => Array
{"var" => "value"}.class => Hash
(1..5).class => Range
("abc".."xyz").class => Range
/hoge/.class => Regexp
true.class => TrueClass
false.class => FalseClass
TrueClass.superclass => Object
nil.class => NilClass
String.class => Class
Object.class => Class
Class.class => Class

  • 数字はプリミティブではなくオブジェクト。
  • 範囲や正規表現もオブジェクトで表現できる。
  • true,false,nilもオブジェクト。
  • TrueClass,FalseClassの直接の親がObjectとなっておりBoolean型が存在しない。
  • 全てのクラスはClassクラスのオブジェクト。
  • ClassクラスもまたClassクラスのオブジェクト。

クラスの継承とモジュールのMix-in


Class.superclass => Module
Module.superclass => Object
Object.superclass => nil
Object.included_modules => [Kernel]
Array.included_modules => [Enumerable, Kernel]
Hash.included_modules => [Enumerable, Kernel]
String.included_modules => [Enumerable, Comparable, Kernel]
Fixnum.included_modules => [Precision, Comparable, Kernel]

  • ClassクラスのスーパークラスはModuleクラス
  • ModuleクラスのスーパークラスはObjectクラス
  • Objectはルートクラス。
  • ObjectクラスはKernelモジュールをMix-inしている。
  • Enumerableは繰り返し処理のメソッドを備えたモジュールで、Comparableは比較処理をするメソッドを備えたモジュール。これらのモジュールを各クラスがMix-inして固有の実装を行うことでポリモーフィズムを実現する。これをduck typingというらしい。

たとえばComparable#<メソッドはStringオブジェクトに対してもFixnumオブジェクトに対しても呼べるが、


"a" < "b" => true
1 < 2 => true
のように実装は異なっている。これはJavaでいえばインタフェースを実装した各クラスが固有の実装をしているのと同じである。Ruby動的言語なのでインタフェースで型を強制する意味が無いためインタフェースが存在しない。Javaはインタフェースでポリモーフィズムを実現するが、RubyはモジュールをMix-inすることで実現する。