- クラスのインスタンスメソッド
- クラス定義の内側・外側からともに呼び出すことができる
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"
private と public は何度も書くことができるが- 最初に
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)