Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. public / private / protected

public / private / protected

Rubyのメソッドアクセス制御(可視性)を設定するキーワードです。オブジェクト外部からの呼び出しを制限してカプセル化を実現します。

構文
class クラス名
  # public: どこからでも呼び出せます(デフォルト)。
  public

  def 公開メソッド
    処理
  end

  # private: クラス内部(自分自身)からしか呼び出せません。
  private

  def 非公開メソッド
    処理
  end

  # protected: 同じクラスとサブクラスのインスタンスから呼び出せます。
  protected

  def 準公開メソッド
    処理
  end

  # Ruby 2.1+ はメソッド名を直接引数に渡す書き方も使えます。
  private :メソッド名
  private def メソッド名; 処理; end
end
メソッド一覧
キーワード概要
publicどこからでも呼び出せるメソッドを定義します。クラス外部からもアクセス可能です。デフォルトの可視性です。
privateクラス内部からのみ呼び出せるメソッドを定義します。クラス外部や別インスタンスからは呼び出せません。
protected同じクラスまたはサブクラスのインスタンスから呼び出せるメソッドを定義します。比較メソッドなどで使います。
send(:メソッド名)privateメソッドも含めて名前で呼び出せます。テストや動的呼び出しに使います。
public_send(:メソッド名)publicメソッドのみ呼び出せます。privateメソッドには『NoMethodError』が発生します。
サンプルコード
class BankAccount
  attr_reader :balance

  def initialize(owner, balance)
    @owner = owner
    @balance = balance
  end

  # public: 外部から呼び出せます。
  def deposit(amount)
    validate_amount(amount)  # private メソッドを内部から呼び出します。
    @balance += amount
    puts "#{amount}円を入金しました。残高: #{@balance}円"
  end

  def >(other)
    balance > other.balance  # protected メソッドへのアクセス(別インスタンス)。
  end

  private

  # private: クラス外部からは呼び出せません。
  def validate_amount(amount)
    raise ArgumentError, "金額は正の数である必要があります" if amount <= 0
  end

  protected

  # protected: 同じクラスのインスタンス間で呼び出せます(残高比較に使います)。
  def balance
    @balance
  end
end

口座A = BankAccount.new("Alice", 10000)
口座B = BankAccount.new("Bob", 5000)

口座A.deposit(3000)      # 3000円を入金しました。残高: 13000円
puts 口座A > 口座B        # true(protected メソッドを内部で使って比較)

# private メソッドを外部から呼ぶと NoMethodError。
begin
  口座A.validate_amount(100)
rescue NoMethodError => e
  puts "エラー: #{e.message}"  # エラー: private method 'validate_amount' called...
end
概要

『public』はデフォルトの可視性で、クラス外部のどこからでも呼び出せます。『private』はクラス内部からのみ呼び出せ、クラス外部や同じクラスの別インスタンスからも呼び出せません。『protected』はその中間で、同じクラスまたはサブクラスのインスタンス間でのみ呼び出せます。

『protected』は主に同じクラスのインスタンス同士を比較するメソッドに使います。上記の例のように、比較演算子の実装で別インスタンスのデータにアクセスしたい場合に便利です。

Rubyの『private』はJavaなどと異なり、「レシーバを明示した呼び出しが禁止される」という仕組みです。Ruby 2.7より前のバージョンでは『self.private_method』という形式でも呼び出しが禁止されていましたが、Ruby 2.7以降は『self.private_method』が許可されています。

クラスの基本定義は『class / initialize / attr_accessor』を、selfとクラスメソッドの詳細は『self / @変数 / @@変数』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。