#メソッド
メソッドはオブジェクトに定義されているものでそのオブジェクトに関連する「操作」を行うために使われる。
Rubyでは全ての「操作」がメソッドとして実装されている。
##メソッドの呼び出し
###単純なメソッドの呼び出し
メソッドの呼び出し構文は以下の通り
オブジェクト.メソッド名(引数1, 引数2, ..., 引数n)
先頭にオブジェクトが一つ置かれ、その後ろにピリオド「.」を挟み、メソッド名が続く。
メソッド名の後ろには「()」で囲まれたメソッドの引数が並ぶ。
引数の数と順番はメソッドごとに決められているので、それに合わせて指定しなければならない。
なお、この「()」は省略できる。
上記構文のオブジェクトは「レシーバ」とも呼ばれる。
これはオブジェクト指向の世界ではメソッドを実行することを「オブジェクトにメッセージを送る」、その結果として
「オブジェクトはメッセージを受け取る」と考えるから。
##メソッドの分類
Rubyのメソッドはレシーバにによって3種類に分けることができる
- インスタンスメソッド
- クラスメソッド
- 関数的メソッド
###インスタンスメソッド
あるオブジェクト(インスタンス)があった時、そのオブジェクトをレシーバとするメソッドのことを「インスタンスメソッド」と呼ぶ。インスタンスメソッドには以下のようなものがある。
p "1,2,3,4,5".split(',')
#=> ["1", "2", "3", "4", "5"]
p [1,2,3,4,5].index(2)
#=> 1
p 1000.to_s
#=> "1000"
上から順に文字列、配列、数値の各オブジェクトがレシーバになっている。
オブジェクトに対してどのようなインスタンスメソッドが使えるかは、そのオブジェクトの種類(クラス)によって決められる。オブジェクトに対してインスタンスメソッドを呼び出すと、そのクラスごとに決められた処理が実行される。
###クラスメソッド
レシーバがインスタンスではなくクラスそのものだった場合、そのメソッドは「クラスメソッド」という。
例えば、インスタンスを作るような場合にはクラスメソッドが使われる。
Array.new #新しい配列オブジェクトを作る
File.open("some_file") #与えらしいファイルオブジェクトを作る
Time.now #新しいTimeオブジェクトを作る
```
また、直接インスタンスを操作するわけではないけれども、そのクラスに関連する操作を行いたい場合にもクラスメソッドが使われる。例えば、ファイル名を変更するにはファイルクラスのクラスメソッドを使用する
```ruby:ruby
File.rename(oldname, newname) #ファイル名を変更する
```
補足:クラスメソッドの呼び出しには「.」の代わりに「::」をつけることもできる
どちらもRubyの記法としては同じ意味。
##関数的メソッド
レシーバがないメソッドを関数的メソッドと呼ぶ。
もっとも「レシーバがない」と言ってもレシーバに該当するオブジェクトがないわけではない。
関数的メソッドにはそれが省略されている。
```ruby:ruby
print "test" #コンソールに文字列を出力する
sleep(10) #指定された秒数の間、処理を休止する。
```
関数的メソッドはレシーバの状態によって結果が変わることのないように作られている。
printメソッドやsleepメソッドはレシーバの情報を必要としない。