มีการกำหนดวิธีการอินสแตนซ์ภายในบล็อกคำจำกัดความของคลาส วิธีการเรียนถูกกำหนดเป็นวิธีการเดี่ยวในชั้นเรียนเดี่ยวของชั้นที่รู้จักกันอย่างไม่เป็นทางการว่า "metaclass" หรือ "eigenclass" private
ไม่ใช่คำหลัก แต่เป็นวิธีการ ( โมดูล # ส่วนตัว )
นี่คือการเรียกไปยังวิธีการself#private
/ A#private
ที่ "สลับ" การเข้าถึงแบบส่วนตัวบนสำหรับคำจำกัดความวิธีการของอินสแตนซ์ที่กำลังจะมาถึงจนกว่าจะสลับเป็นอย่างอื่น:
class A
private
def instance_method_1; end
def instance_method_2; end
# .. and so forth
end
ตามที่ระบุไว้ก่อนหน้านี้วิธีการเรียนเป็นวิธีการเดี่ยวที่กำหนดไว้ในระดับชั้นเดียว
def A.class_method; end
หรือใช้ไวยากรณ์พิเศษเพื่อเปิดเนื้อหาคำจำกัดความของคลาส singleton แบบไม่ระบุชื่อของ A:
class << A
def class_method; end
end
ผู้รับของ "ข้อความส่วนตัว" - self -inside class A
เป็นวัตถุคลาส A. ตนเองภายในclass << A
บล็อกเป็นวัตถุอื่นชั้นเดียว
ตัวอย่างต่อไปนี้เป็นการโทรจริงสองวิธีที่แตกต่างกันที่เรียกว่าส่วนตัวโดยใช้ผู้รับหรือเป้าหมายที่แตกต่างกันสองคนสำหรับการโทร ในส่วนแรกเรากำหนดวิธีการอินสแตนซ์ส่วนตัว ("ในคลาส A") ในส่วนหลังเรากำหนดวิธีการเรียนส่วนตัว (ในความเป็นจริงเป็นวิธีการเดี่ยวในวัตถุชั้นเดี่ยวของ A)
class A
# self is A and private call "A.private()"
private def instance_method; end
class << self
# self is A's singleton class and private call "A.singleton_class.private()"
private def class_method; end
end
end
ทีนี้ลองเขียนตัวอย่างนี้อีกหน่อย:
class A
private
def self.class_method; end
end
คุณเห็นความผิดพลาดที่ [นักออกแบบภาษา Ruby] ทำขึ้นมาหรือไม่? คุณสลับการเข้าถึงแบบส่วนตัวสำหรับวิธีการอินสแตนซ์ที่กำลังจะมาถึงทั้งหมดของ A แต่ดำเนินการประกาศวิธีการแบบซิงเกิลในคลาสที่แตกต่างนั่นคือคลาสซิงเกิล