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