Class (vol.5 呼び出しの制限 private)

  • クラスのインスタンスメソッド
    • クラス定義の内側・外側からともに呼び出すことができる
  • private メソッドを使うことで、そのメソッドの呼び出しをクラス定義の中だけに限定することができる
  • 制限を持たせることで、他のプログラマーにそのクラスの使い方を明示することができる
    • プログラムを通じて、作ったクラスとメソッドを、そのオブジェクトらしく正しく使ってもらう方法を伝える役割を果たす

メソッドの呼び出しを制限する private

  • メソッド定義の前部分に private を付与すると
    • 以降は private メソッドとなり、クラス定義の外側からは呼び出せなくなる
class Sample
  def a
    "a"
  end
  def b
    "b"
  end

  private # これより前は public / これより後は private なメソッド

  def c
    "c"
  end
  def d
    "d"
  end
end

sample = Sample.new

p sample.a # "a"
p sample.b # "b"
p sample.c # エラー
p sample.d # エラー
class Greeting
  def user
    "いらっしゃいませ"
  end
  def admin
    otsukare
  end

  private
  def otsukare
    "お疲れ様です"
  end
end

greeting = Greeting.new

puts greeting.user # いらっしゃいませ
puts greeting.admin # お疲れ様です
puts greeting.otsukare # エラー (NoMethodError)
  • 途中で public を付与すると、それ以降は public なメソッドとなる
    • (クラス定義の外側からでもアクセスできる)
class Sample
  def a # public
    "a"
  end

  private

  def b # private
    "b"
  end

  public

  def c # public
    "c"
  end
end

sample = Sample.new

p sample.a # "a"
p sample.b # エラー
p sample.c # "c"
  • privatepublic は何度も書くことができるが
    • 最初に public なメソッドをまとめて書き
    • その後に private なメソッドをまとめて書くことが一般的
      • そのクラスの使い方を知る時には public なメソッドを読む必要があり、先頭に書いてあった方が都合がよいため

単一のメソッドを制限する

  • def の直前に private を記載することで、そのメソッド限定で private なメソッドにすることができる
class Sample
  def a
  end
  private def b
  end
end

プライベートなクラスメソッドを定義する private_class_method

  • クラスメソッドの場合は、インスタンスメソッドのように private を記述してもメソッドがクラスの外側から実行できてしまう
class Sample
  private
  def self.a
    "a"
  end
end

p Sample.a # "a"
  • def の前の位置private_class_method を記述することで、プライベートなメソッドにすることができる
class Sample
  private_class_method def self.a
    "a"
  end
end

p Sample.a # エラー (NoMethodError)