Rubyのプライベートメソッド:
Rubyでメソッドがプライベートの場合、明示的なレシーバー(オブジェクト)から呼び出すことはできません。暗黙的にのみ呼び出すことができます。このクラスのサブクラスだけでなく、それが記述されているクラスからも暗黙的に呼び出すことができます。
次の例はそれをよりよく説明します:
1)プライベートメソッドclass_nameを持つAnimalクラス
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
この場合:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2)両生類と呼ばれる動物のサブクラス:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
この場合:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
ご覧のとおり、プライベートメソッドは暗黙的にのみ呼び出すことができます。明示的なレシーバーから呼び出すことはできません。同じ理由で、プライベートメソッドを定義クラスの階層外で呼び出すことはできません。
Rubyの保護されたメソッド:
Rubyでメソッドが保護されている場合は、定義クラスとそのサブクラスの両方から暗黙的に呼び出すことができます。さらに、レシーバーが自分自身または自分と同じクラスである限り、明示的なレシーバーから呼び出すこともできます。
1)プロテクトメソッドprotect_meを使用するAnimalクラス
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
この場合:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2)動物クラスから継承された哺乳類クラス
class Mammal < Animal
def mammal_call
protect_me
end
end
この場合
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3)動物クラスから継承された両生類クラス(哺乳類クラスと同じ)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
この場合
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4)Treeというクラス
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
この場合:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
他のすべてのインスタンスのプライベートメソッドの呼び出しを許可されている場合、のObject
ようなことを言うことは可能5.puts("hello world")
です。