Rubyチュートリアル ~英文小説の最頻出ワードを見つけよう!(その2)
これから説明するのは次の4つの項目です
- Rubyはオブジェクト指向です
- Rubyのブロックは仮装オブジェクトです
- クラスはオブジェクトの母であってクラスの子であるオブジェクトです
- Rubyはユーザフレンドリです
1. Rubyはオブジェクト指向です
依然として現在主流のプログラミング言語は手続き型です。手続き型言語では手続きは関数などのかたちでモジュール化されていますが、データ構造はそれとは別に管理されています。
でもRubyではデータ構造も手続きと一緒にパッケージ化されており、それはオブジェクトと呼ばれています。つまりRubyではプログラムを組成する最小単位はオブジェクトです。そのためRubyプログラマのやるべきことは、「メモリ空間に必要なオブジェクトを生成し、それにメッセージを送ってその結果としてのオブジェクトを得る」というかたちでプログラムを組成することになります。
例えば、次の例はメモリ空間に文字列オブジェクトを生成し、それにlengthというメッセージを送っています。
'hippopotamus'.length # => 12
文字列をクォートすれば文字列オブジェクトが生成されます。生成された文字列オブジェクト’hippopotamus’は、内部に多数のメソッドを持っており、lengthメッセージが送られるとこれに対応するメソッドを検索し、あればそれを起動し結果を返します。
通常反応するメソッドは、送られるメッセージ名と同じ名前を持っています。ですからこれからはメッセージとメソッドを区別しないで用います。メッセージを受けるオブジェクトのことを、レシーバと言うことがあります。
注目して頂きたいのは、オブジェクトがメッセージを受けて返す値は、オブジェクトであるということです。つまり上で返された整数12は単なる整数ではなく、整数オブジェクト1なのです。従ってこの返された値もメッセージを受け取ることができます。ですからRubyではこんな記述が許されます。
'hippopotamus'.length.even? # => true
これはメソッドチェーンと呼ばれることがあります。
別の例を示します。
['donkey', 'alligator', 'hippopotamus'].at(0) # => "donkey"
これはメモリ空間に3つの文字列オブジェクトを要素として含んだ、1つの配列オブジェクトを生成し、それにatメソッドを0整数オブジェクトを引数に付けて送っているコードです。任意のオブジェクトを[ ]で括ると配列オブジェクトが生成されます
このようにメッセージには引数を付けることができます。ただしRubyはオブジェクトしか相手にしませんから、この引数はオブジェクトでなければなりません。返される結果は配列の先頭要素の’donkey’文字列オブジェクトです。確認のためこの結果にもメソッドチェーンを試みてみましょう。
['donkey', 'alligator', 'hippopotamus'].at(0) # => "donkey"
['donkey', 'alligator', 'hippopotamus'].at(0).length # => 6
['donkey', 'alligator', 'hippopotamus'].at(0).length.even? # => true
メソッドチェーンの個数に制限はありません。暇つぶしをしたいのなら次のようにしてもかまいません。
1.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next.next # => 100
(次回に続く)
- 正確には固定長整数オブジェクト ↩
blog comments powered by Disqus