ซูเปอร์คีย์เวิร์ดทำอะไรใน Ruby?
มันเรียกเมธอดบนคลาสพาเรนต์ที่มีชื่อเดียวกับเมธอดที่เรียก super
.
ตัวอย่างเช่น :
หากคุณเรียกเมธอดชื่อ i_like_chocolate
แล้วคุณเรียก super
ภายในวิธีการนั้น Ruby จะพยายามค้นหาวิธีอื่นที่มีชื่อเดียวกันนั้นในคลาสพาเรนต์ของใครก็ตามที่เป็นเจ้าของวิธีนี้
สิ่งนี้จะผุดขึ้นอย่างต่อเนื่องผ่านสายบรรพบุรุษของคลาส เหมือนการเรียกเมธอดปกติ .
หากไม่มีวิธีการนี้จะทริกเกอร์ NoMethodError
ข้อยกเว้น และถ้า method_missing
พบว่ามันจะใช้สิ่งนั้น
ตอนนี้ :
มาดูตัวอย่างโค้ดกัน!
สุดยอดโดยไม่มีข้อโต้แย้ง
ในตัวอย่างต่อไปนี้ เรามี Cat
คลาสที่สืบทอดมาจาก Animal
.
Cat
คลาสมี name
เมธอดที่ใช้ super
เพื่อเรียกเมธอดเดียวกันในคลาสพาเรนต์ (Animal
)
นี่คือรหัส:
class Animal def name puts "Animal" end end class Cat < Animal def name super end end cat = Cat.new cat.name # "Animal"
คีย์เวิร์ด Ruby super ทำงานแตกต่างกันเมื่อใช้โดยมีหรือไม่มีอาร์กิวเมนต์ .
ไม่มีอาร์กิวเมนต์:
จะ ส่งต่ออาร์กิวเมนต์ที่ใช้สำหรับการเรียกเมธอดดั้งเดิมไปยังอันใหม่ รวมถึงอาร์กิวเมนต์ของคีย์เวิร์ด &บล็อกหากกำหนดไว้
นี่คือตัวอย่าง :
def puts(*) super end puts 1, 2, 3
เมธอดนี้กำหนดไว้ภายนอกคลาสใดๆ จะเป็นของ Object
. ซึ่งหมายความว่าจะถูกเรียกก่อน puts
. ดั้งเดิม วิธีการ
ตอนนี้:
เมื่อคุณเรียก puts
คุณกำลังเรียกวิธีการใหม่นี้ที่เราสร้างขึ้นซึ่งใช้ super
เพื่อเรียก puts
. ต้นฉบับ .
เมื่อใดควรใช้ Super vs Super()
เราเพิ่งมาดูวิธีใช้ super
สำหรับการเรียกใช้เมธอดของผู้ปกครอง
แต่ จะเกิดอะไรขึ้นถ้าเมธอดหลักใช้อาร์กิวเมนต์ไม่เท่ากัน
ในกรณีนั้น คุณสามารถใช้:
super()
ไม่มีข้อโต้แย้งsuper(arg1, arg2, ...)
เพื่อเลือกข้อโต้แย้งที่คุณต้องการส่งผ่าน
ตัวอย่าง :
def puts super() end
สังเกตว่า วงเล็บมีความหมายพิเศษอย่างไร ไม่เหมือนกับการเรียกใช้เมธอดปกติ
อีกสองสามสิ่งที่ควรรู้เกี่ยวกับ super
:
- ใช้ได้ภายในเมธอดเท่านั้น
- ส่งคืนผลลัพธ์จากการเรียกเมธอดหลัก
- เรียกได้หลายครั้ง
เส้นหนา (super
ส่งคืนผลลัพธ์) เป็นกุญแจสำคัญในการทำความเข้าใจการใช้งานบางอย่างสำหรับ super
ที่คุณอาจพบได้ในป่า
คุณสามารถใช้ super
เพื่อนำรูปแบบมัณฑนากรไปใช้หรือถ้าคุณเรียกมันว่าภายใน initialize
สามารถใช้เพื่อเริ่มต้นตัวแปรอินสแตนซ์ในคลาสหลักได้
สรุป
คุณได้เรียนรู้เกี่ยวกับ รูบี้ซุปเปอร์คีย์เวิร์ด มันคืออะไรและทำงานอย่างไรในสถานการณ์ต่างๆ!
หากคุณชอบบทความนี้ คุณอาจต้องการสมัครรับจดหมายข่าว RubyGuides เพื่อรับเนื้อหาเพิ่มเติมเช่นนี้ และเคล็ดลับ Ruby ที่เป็นประโยชน์อื่นๆ ที่มีให้สำหรับสมาชิกเท่านั้น