วิธีการส่วนตัวในทับทิม:
หากเมธอดนั้นเป็นไพรเวตใน Ruby จะไม่สามารถเรียกได้โดยตัวรับที่ชัดเจน (object) สามารถโทรได้โดยปริยาย มันสามารถถูกเรียกโดยปริยายโดยชั้นที่มันได้รับการอธิบายในเช่นเดียวกับโดยคลาสย่อยของชั้นนี้
ตัวอย่างต่อไปนี้จะอธิบายได้ดีกว่า:
1) คลาสของสัตว์ที่มีเมธอด 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
อย่างที่คุณเห็นวิธีการส่วนตัวสามารถเรียกได้โดยปริยายเท่านั้น ไม่สามารถเรียกได้โดยผู้รับที่ชัดเจน ด้วยเหตุผลเดียวกันไม่สามารถเรียกวิธีส่วนตัวนอกลำดับชั้นของคลาสที่กำหนดได้
วิธีการป้องกันในทับทิม:
หากวิธีการได้รับการคุ้มครองในทับทิมก็สามารถเรียกได้ว่าเป็นทั้งชั้นกำหนดและชั้นย่อยของมันโดยปริยาย นอกจากนี้พวกเขายังสามารถถูกเรียกโดยผู้รับที่ชัดเจนตราบใดที่ผู้รับเป็นตัวของตัวเองหรือมีระดับเดียวกันกับของตัวเอง:
1) คลาสสัตว์ที่มีวิธีการป้องกัน 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) คลาสสัตว์ครึ่งบกครึ่งน้ำที่สืบทอดจากคลาสสัตว์ (เช่นเดียวกับสัตว์เลี้ยงลูกด้วยนม)
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")
นี้