Частные методы в Ruby:
Если метод в Ruby является частным, он не может быть вызван явным получателем (объектом). Его можно вызвать только неявно. Он может быть вызван неявно классом, в котором он был описан, а также подклассами этого класса.
Следующие примеры лучше проиллюстрируют это:
1) Класс Animal с частным методом class_name
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) Подкласс Animal под названием Amphibian:
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) Класс Animal с защищенным методом protect_me
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) Класс амфибий, унаследованный от класса Animal (то же, что и класс млекопитающих).
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>
person
Aaditi Jain
schedule
17.01.2015
Object
было разрешено вызывать частные методы всех остальных экземпляровObject
, можно было бы говорить такие вещи, как5.puts("hello world")
. - person sepp2k   schedule 21.08.2010