今まで「メソッド」という言葉をきちんと説明せずに来たが,ここ らでちゃんと説明しておこう.
オブジェクト指向の場合,オブジェクトに対して処理をお願いする と,オブジェクト自身が適切な手続きを選択する.この選択された 手続きのことを「メソッド」と呼ぶ.
rubyではオブジェクトのメソッドを起動するためには(もう何度も 出ているけれど),このような形式を使う.
ruby> "abcdef".length 6
これは"abcdef"という「文字列オブジェクト」の`length'という名 前で定義されたメソッドを呼び出したことになる.
この名前からメソッドを呼び出す選択は実行時に行われるので,同 じ変数に対して同じメッセージを送っても,変数の中身によって実 行されるメソッドは違ってくる.
ruby> foo = "abc" "abc" ruby> foo.length 3 ruby> foo = [1, 2] [1, 2] ruby> foo.length 2
文字列と配列とでは当然長さを求める具体的な処理は異なっている わけだが,rubyは自動的に適切な処理を選んでいる.これをポリモ ルフィズムとか,多態とか呼ぶ.もちろんオブジェクトが知らない メソッドを呼んだ場合にはエラーになる.
ruby> foo = 5 5 ruby> foo.length ERR: undefined method `length' for 5(Fixnum)
だから,ユーザはオブジェクトがどんなリクエストを受け付けるか, あるいはどんなメソッドを持っているかだけに関心を払えば良くて, 内部でどんな処理が行われているか知る必要は無い.
メソッドに引数がある時には括弧でくくって後ろにつける.たとえ ば,
object.method(arg1, arg2)
のような感じである.曖昧でない限り引数の括弧は省略できる.だ から上の例だと
object.method arg1, arg2
と書いても同じだ.
rubyにはselfという特別な変数があって,メソッドを実行した主体 になったオブジェクト(呼び出し元の`.'の左側の値)を保持してい る.このselfのメソッド呼び出しは頻繁に行われるので,省略形が 用意されている.
self.method_name(args...)
はselfを省略して
method_name(args...)
と書くことができる.今まで関数と呼んでいたものは,このselfへ のメソッド呼び出しであったのだ.この辺がrubyが純粋なオブジェ クト指向言語と呼ばれる理由である.
とはいえ,関数的に使うメソッドはほとんど通常の言語の関数と同 じような働きをするから,全てがメソッドであることにそれほと意 味があるかというと,あまりないような気もする.