LoginSignup
13
10

More than 3 years have passed since last update.

Rubyのメソッド公開レベル(public, protected, private)

Posted at

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メソッドは、そのメソッドを定義したクラス自身と、そのサブクラスのインスタンスメソッドからレシーバ付きで呼び出せるメソッド。

以上。

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10