Rubyのメソッド公開レベルについて、初心者でも理解できる記事が見つけられなかったので、少々情報が正しいか不安ですが、投稿させていただきます。
Ruby初心者が、どうにかこうにかしてまとめたものなので、下記情報は過度に信じないようお願いいたします。
間違いありましたら、更新しますので、お気軽に教えていただけますと幸いです。
まず、下記、るりまの説明を少々いじったものになります。
- public に設定されたメソッドは制限なしに呼び出せる(特に指定しない場合は「public」に設定される)
- private に設定されたメソッドは関数形式でしか呼び出せない(レシーバの利用ができない)
- protected に設定されたメソッドは、そのメソッドを持つオブジェクトがselfであるコンテキスト(メソッド定義式やinstance_eval)でのみ呼び出せる
まず、いきなりですが、まとめから入ります。
その後、各項目について見ていきます。
まとめ
公開レベル | 外部から隠す(全体へは非公開) | 自クラス及びサブクラスから 関数形式での呼び出し |
自クラス及びサブクラスから レシーバ形式での呼び出し |
---|---|---|---|
public | × | ○ | ○ |
private | ○ | ○ | × |
protected | ○ | ○ | ○ |
ポイントは、privateはレシーバ形式での呼び出しができない(関数形式でのみ呼び出し可能)ということ。
protectedであればレシーバ形式での呼び出しが可能になるということ。
hoge = Hoge.new
hoge.protected_method # protectedのメソッドならOK
hoge.private_method # privateのメソッドではError
外部には公開したくないが、同じクラスやサブクラスの中でレシーバ付きで呼び出せるようにしたい時にprotectedを使う。
public
publicメソッドは、クラスの外部からでも呼び出せる。
(initializeメソッド以外のインスタンスメソッドはデフォルトでpublicメソッドになる。
※インスタンスメソッドとは、クラス構文の内部で定義するとつくることができるメソッドで、そのクラスのインスタンスが呼びだすメソッド。)
private
privateメソッドは、クラスの外部からは呼び出せず、クラスの内部でのみ使用できるメソッド(サブクラスでも呼び出し可能)。厳密には、レシーバを指定して呼び出すことができないメソッド。
そのため、クラスの内部でレシーバを指定して呼び出そうとしても呼び出せない(selfというレシーバをつけて呼び出したことになるため。selfを省略して呼び出せばエラーは発生しない)。(補足:レシーバとは、bird.flyと書いた場合、birdが(flyメソッドの)レシーバになる。(birdにflyのメッセージ(処理の内容)を送るという考え方により、受け取り側のbirdがレシーバになる。))クラス内でprivateと書くことで、そこから下で定義されたメソッドはprivateメソッドになる。privateメソッドになるのは、インスタントメソッドのみであり、クラスメソッド(例:self.hello)はprivate以下に定義してもprivateにならない。クラスメソッドをprivateにする場合は、class << self の構文を使うか、private_class_methodでクラスメソッド定義後に公開レベルを変更する方法がある。また、後からメソッドの公開レベルを変更する方法もある(private :hello のようにprivateメソッドに引数(既存のメソッド名)を渡す)。privateメソッドはサブクラスでも呼び出し可能なのでオーバーライド可能。
protected
protectedメソッドは、そのメソッドを定義したクラス自身と、そのサブクラスのインスタンスメソッドからレシーバ付きで呼び出せるメソッド。
以上。