Rubyのメソッド可視性(public, protected, private)

2021年4月27日火曜日

Ruby

t f B! P L


概要

Rubyにおけるpublic、protected、privateの振る舞いについて

public

  • クラス定義内におけるメソッドのデフォルト設定
class  C
  def  public_method
    p  'publicだよ'
  end
end

c = C.new
c.public_method
=> "publicだよ"
  • どのインスタンスからも実行できる。
class  C
  public
  def  public_method
    p  'publicだよ'
  end
end

c = C.new
c.public_method
=> "publicだよ"

other_c = C.new
c.public_method
=> "publicだよ"

protected

  • クラスのメソッド定義内で呼び出し可能
class  C
  def  call_protected_method
    protected_method
  end

  protected
  def  protected_method
    p  'protectedだよ'
  end
end

c = C.new
c.protected_method
=> NoMethodError  # クラスの外からは呼べない

c.call_protected_method
=> "protectedだよ"  # クラス内から呼び出し可能
  • 自分自身、またはサブクラスのインスタンスから実行できる。
class  Parent
  def  call_protected_method(receiver = self)
    receiver.protected_method
  end

  protected
  def  protected_method
    p  "#{self.class}から呼ばれたprotected_methodだよ"
  end
end

class  Child < Parent; end

parent = Parent.new
parent.call_protected_method
=> "Parentから呼ばれたprotected_methodだよ"

child = Child.new
child.call_protected_method
=> "Childから呼ばれたprotected_methodだよ"

private

  • クラス定義外(トップレベル)におけるメソッドのデフォルト設定
def  private_method
  p  'privateだよ'
end

private_method
=> "privateだよ"
  • レシーバつきで呼び出せない
class  C
  def  call_private_method
    private_method
  end

  private
  def  private_method
    p  'privateだよ'
  end
end

c = C.new
c.private_method
=> NoMethodError  # レシーバがついているから呼べない

c.call_private_method
=> "privateだよ"
  • initialize、initialize_copyは可視性を変更しても常にprivate
class  C
  public
  def  initialize
  end
end

c = C.new
c.initialize
=> NoMethodError  # privateメソッドのためNG

自己紹介

Webエンジニアをやっています。日々思ったことや、読書レビュー、IT系の記事などを書き連ねています

Ruby 特異クラス,特異メソッドについて

特異クラス概要 インスタンスに適用される特別なクラス。シングルトンクラスともいう。 インタプリタ内部だけで使用するクラスでユーザ側には意識させたくないクラス 特異クラス定義 class << で特定オブジェクトの特異クラスを定義できる。クラスメソッド定義で使う...

QooQ