ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Ruby - メソッドの種類

Rubyメソッドの種類

主に大きく分けて、レシーバによって、3種類に分けることができる。

レシーバとは

ちなみに、レシーバ(receiver)というのは、以下のメソッドを呼び出す構文のオブジェクトを指す。

オブジェクト.メソッド名(引数1, 引数2, …, 引数n)

なぜかというと、オブジェクト指向の考え方として、メソッドを実行することをオブジェクトにメッセージを送る、その処理結果として、オブジェクトはメッセージを受け取る(receiveする)と考えるから。

インスタンスメソッド

メソッドの種類として最もメジャーなもの、インスタンスメソッド。オブジェクト(インスタンス)自身がレシーバとなる。クラスの中にメソッドを定義した場合、基本的にインスタンスメソッドとなる。

p "maguro,100,2016-4-14".split(",")    #=> ["maguro", "100", "2016-4-14"]
p ['sushiro', 'kappazushi', 'hamazushi'].index('sushiro')    #=> 0
p 100.to_s    #=> "100"

上の文字列、配列、数値がそれぞれレシーバになっている。そのオブジェクトが持っているインスタンスメソッドは各オブジェクトクラスによって処理が書かれている。

クラスメソッド

レシーバがインスタンスではなく、クラスそのものであった場合、それはクラスメソッドという。主にインスタンスを生成する際によく使われる。

Array.new    # 新しい配列を生成
Array["maguro", "salmon", "ikura"]    # 要素を持った配列を生成

クラスメソッドの呼び出し方には二通りがあって、.(ドット)::(ダブルコロン)で、どちらも意味。

クラス名.メソッド名
クラス名::メソッド名

同じ意味ではあるが、定数アクセスにも::を使用するため、メソッド名が大文字から始まっている場合、それは定数としてみなされかねない。 そのため、メソッド名には全て小文字で命名することを留意した上で、明示的にメソッドであることを示す場合はクラス名::メソッド名()というようにメソッド名の後ろに()を付加する。

関数的メソッド

最後に、レシーバがない関数的メソッドがある。ない、というと語弊があって、正確には省略されているだけ。 これらの関数的メソッドは全てのクラスからアクセス可能な、Kernelモジュールに備わっている。

例として

puts "sushi"    # sushiを出力する
sleep(5)    # 指定された秒数分, 処理を中断する

上に示したような関数メソッドは、レシーバの情報を必要としない。

参考

たのしいRuby 第5版

たのしいRuby 第5版

特異クラス・特異メソッド・メソッドの種類 Ruby - Qiita

www.task-notes.com