Rubyチュートリアル 〜英文小説の最頻出ワードを見つけよう!(その2)

これから説明するのは次の4つの項目です

  1. Rubyオブジェクト指向です
  2. Rubyのブロックは仮装オブジェクトです
  3. クラスはオブジェクトの母であってクラスの子であるオブジェクトです
  4. 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

(次回に続く

*1:正確には固定長整数オブジェクト