Các phương thức riêng tư trong Ruby:
Nếu một phương thức là riêng tư trong Ruby, thì nó không thể được gọi bởi một người nhận (đối tượng) rõ ràng. Nó chỉ có thể được gọi ngầm. Nó có thể được gọi ngầm bởi lớp mà nó đã được mô tả cũng như bởi các lớp con của lớp này.
Các ví dụ sau sẽ minh họa nó tốt hơn:
1) Một lớp Thú với phương thức riêng class_name
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
Trong trường hợp này:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Một lớp con của Động vật được gọi là Động vật lưỡng cư:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
Trong trường hợp này:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Như bạn có thể thấy, các phương thức riêng tư chỉ có thể được gọi một cách ngầm định. Họ không thể được gọi bởi người nhận rõ ràng. Vì lý do tương tự, các phương thức riêng tư không thể được gọi bên ngoài hệ thống phân cấp của lớp định nghĩa.
Các phương pháp được bảo vệ trong Ruby:
Nếu một phương thức được bảo vệ trong Ruby, thì nó có thể được gọi ngầm bởi cả lớp định nghĩa và các lớp con của nó. Ngoài ra, chúng cũng có thể được gọi bởi một người nhận rõ ràng miễn là người nhận tự hoặc cùng lớp với người nhận:
1) Một lớp Động vật với phương thức được bảo vệ bảo vệ
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
Trong trường hợp này:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Một lớp động vật có vú được thừa hưởng từ lớp động vật
class Mammal < Animal
def mammal_call
protect_me
end
end
Trong trường hợp này
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Một lớp lưỡng cư được thừa hưởng từ lớp Động vật (giống như lớp động vật có vú)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
Trong trường hợp này
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Một lớp gọi là Cây
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
Trong trường hợp này:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
được phép gọi các phương thức riêng tư của mọi trường hợp khácObject
, thì có thể nói những điều như thế5.puts("hello world")
.