คีย์เวิร์ด super ใน Ruby ทำอะไร?
มันเรียกเมธอดบน parent class ที่มีชื่อเดียวกับเมธอดที่เรียก super
ตัวอย่าง:
หากคุณเรียกเมธอดชื่อ i_like_chocolate และเรียก super ภายในเมธอดนั้น Ruby จะพยายามหาอีกเมธอดหนึ่งชื่อเดียวกันบน parent class ของเจ้าของเมธอดนี้
สิ่งนี้ bubble ขึ้นผ่าน class ancestry chain เหมือน regular method call
หากเมธอดไม่มีอยู่ จะ trigger NoMethodError exception และหากเจอ method_missing จะใช้ตัวนั้น
ตอนนี้:
มา看看ตัวอย่างโค้ด!
Super โดยไม่มี Arguments
ในตัวอย่างต่อไป เรามีคลาส Cat สืบทอดจาก Animal
คลาส Cat มีเมธอด name ที่ใช้ super เรียกเมธอดเดียวกันบน parent class (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 keyword พฤติกรรมต่างออกไปเมื่อใช้พร้อมหรือไม่มี arguments
โดยไม่มี arguments:
มันจะ ส่ง arguments ที่ใช้สำหรับ original method call ไปยังเมธอดใหม่ รวมถึง keyword arguments และ block หากให้
ตัวอย่าง:
def puts(*) super end puts 1, 2, 3
เมธอดนี้ นิยามนอกคลาส จะเป็นของ Object หมายถึงจะถูกเรียกก่อน puts ต้นฉบับ
ตอนนี้:
เมื่อคุณเรียก puts คุณเรียกเมธอดใหม่ที่เราสร้าง ซึ่งใช้ super เรียก puts ต้นฉบับ
เมื่อไหร่ใช้ Super vs Super()
เราเพิ่ง看看วิธีใช้ super เรียก parent methods
แต ถ้า parent method ไม่รับ arguments จำนวนเท่ากัน?
ในกรณีนั้นคุณใช้:
super()สำหรับ no argumentssuper(arg1, arg2, ...)เพื่อเลือก arguments ที่อยากส่ง
ตัวอย่าง:
def puts super() end
สังเกตว่า parentheses มีความหมายพิเศษที่นี่ ไม่เหมือน regular method call
สิ่งอื่นๆ เกี่ยวกับ super:
- ใช้ได้เฉพาะภายในเมธอด
- มันคืนผลลัพธ์จากการเรียก parent method
- เรียกได้หลายครั้ง
บรรทัด bold (super คืนผลลัพธ์) เป็น key สำคัญในการเข้าใจ uses ของ super ที่คุณอาจพบ
คุณใช้ super implement decorator pattern หรือหากเรียกภายใน initialize ใช้ initialize instance variables บน parent class ได้
สรุป
คุณเรียนรู้เกี่ยวกับ Ruby super keyword คืออะไร และทำงานอย่างไรในสถานการณ์ต่างๆ แล้ว!
หากเพลิดเพลินกับบทความนี้ คุณอาจอยากสมัครรับจดหมายข่าว RubyGuides เพื่อรับเนื้อหาแบบนี้และ Ruby tips อื่นๆ ที่มีเฉพาะผู้สมัคร