Rubyチュートリアル 〜英文小説の最頻出ワードを見つけよう!(その2)
これから説明するのは次の4つの項目です
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:正確には固定長整数オブジェクト