Приватні методи в 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) Підклас тварини під назвою Земноводний:
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) Клас тварин із захищеним методом protection_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) Клас під назвою Дерево
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")
.