クラスについて学ぶとき、superclassメソッドを使ってクラス階層を調べてみるとよくわかります。
>> s = String.new("foobar")
=> "foobar"
>> s.class # 変数sのクラスを調べる
=> String
>> s.class.superclass # Stringクラスの親クラスを調べる
=> Object
>> s.class.superclass.superclass # Ruby 1.9からBasicObjectが導入
=> BasicObject
>> s.class.superclass.superclass.superclass
=> nil
StringクラスのスーパークラスはObjectクラス
ObjectクラスのスーパークラスはBasicObjectクラス
BasicObjectクラスはスーパークラスを持たないことがわかる。
この図式は、すべての Ruby のオブジェクトにおいて成り立ちます
クラス階層をたどっていくと、
Rubyにおけるすべてのクラスは最終的にスーパークラスを持たないBasicObjectクラスを継承
する。
"Rubyではあらゆるものがオブジェクトである" ということの技術的な意味になる。
BasicObject
↑
Object
↑
String
>> class Word
>> def palindrome?(string)
>> string == string.reverse
>> end
>> end
=> :palindrome?
>> w = Word.new # Wordオブジェクトを作成する
=> #<Word:0x22d0b20>
>> w.palindrome?("foobar")
=> false
>> w.palindrome?("level")
=> true
少し不自然に思えるならば、勘が鋭い
文字列を引数に取るメソッドを作るためだけに、わざわざ新しいクラスを作るのは変
Wordクラスは Stringクラスを継承するのが自然
コンソールでWordクラスを定義する。
>> class Word < String # WordクラスはStringクラスを継承する
>> # 文字列が回文であればtrueを返す
>> def palindrome?
>> self == self.reverse # selfは文字列自身を表します
>> end
>> end
=> :palindrome?
継承のためのRubyの Word < String 記法
>> s = Word.new("level") # 新しいWordを作成し、"level" で初期化する
=> "level"
>> s.palindrome? # Wordが回文かどうかを調べるメソッド
=> true
>> s.length # WordはStringで扱える全てのメソッドを継承している
=> 5
WordクラスはStringクラスを継承しているので、コンソールを使ってクラス階層
>> s.class
=> Word
>> s.class.superclass
=> String
>> s.class.superclass.superclass
=> Object
階層
BasicObject
↑
Object
↑
String
↑
Word
となっている。
Wordクラスの中から自分自身が持つ単語にアクセスすることで行なっていることにご注目
Wordクラスの中では、selfはオブジェクト自身を指します。
self == self.reverse
self == reverse
演習
1.Range,Hash,Symbolクラスの継承階層を調べろ。
>> s = Range.new(1, 5)
=> 1..5
>> s.class
=> Range
>> s.class.superclass
=> Object
>> s.class.superclass.superclass
=> BasicObject
>> s.class.superclass.superclass.superclass
=> nil
>> s = {"a" => "b", "c" => "d", "e" => "f" }
=> {"a"=>"b", "c"=>"d", "e"=>"f"}
>> s.class
=> Hash
>> s.class.superclass
=> Object
>> s.class.superclass.superclass
=> BasicObject
>> s.class.superclass.superclass.superclass
=> nil
>> s = :symbol
=> :symbol
>> s.class
=> Symbol
>> s.class.superclass
=> Object
>> s.class.superclass.superclass
=> BasicObject
>> s.class.superclass.superclass.superclass
=> nil
全てBasicObjectクラスに繋がっている。
2.self.reverseのselfを省略し、reverseと書いて動くことを確認しろ。
>> class Word < String
>> def palindrome?
>> self == reverse
>> end
>> end
=> :palindrome?
>> s = Word.new("level")
=> "level"
>> s.palindrome?
=> true