LoginSignup
0
0

More than 1 year has passed since last update.

railsチュートリアル第4章 クラス継承

Posted at

クラスについて学ぶとき、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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0