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