prepend และการค้นหาเมธอด
สายโซ่บรรพบุรุษ
prepend และการค้นหาเมธอด เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
ลำดับบรรพบุรุษ
เมื่อคุณเรียกเมธอด Ruby จะค้นหารายการที่เรียกว่า ลำดับบรรพบุรุษ โดยคำจำกัดความแรกที่ตรงกันจะเป็นคำจำกัดความที่ถูกใช้ การทำความเข้าใจลำดับนี้ช่วยอธิบายการทำงานร่วมกันของโมดูลเสริมและการสืบทอด
class Animal; end
class Dog < Animal; end
p Dog.ancestorsลำดับการค้นหาเมธอด
Ruby จะค้นหาในคลาสของวัตถุก่อน จากนั้นจึงค้นหาในโมดูลที่รวมไว้ แล้วจึงค้นหาในคลาสแม่ และไล่ขึ้นไปตามลำดับจนกว่าจะพบเมธอด
module M
def hello; "from module"; end
end
class C
include M
def hello; "from class"; end
end
puts C.new.helloinclude อยู่ใต้คลาส
โมดูลที่ใช้ include จะอยู่ ถัดลงมาโดยตรง จากคลาสในลำดับ เมธอดของคลาสจึงมีลำดับความสำคัญเหนือเมธอดของโมดูล
module M; end
class C
include M
end
p C.ancestors # [C, M, Object, ...]ทำความรู้จักการแทรกโมดูลด้านหน้า
prepend จะแทรกโมดูลไว้ เหนือ คลาสในลำดับ ดังนั้น Ruby จะพบเมธอดของโมดูล ก่อน เมธอดของคลาสเอง
module M
def hello; "from module"; end
end
class C
prepend M
def hello; "from class"; end
end
puts C.new.helloprepend ในลำดับ
ตรวจสอบบรรพบุรุษเพื่อดูว่า prepend วางโมดูลไว้ก่อนคลาส
module M; end
class C
prepend M
end
p C.ancestors # [M, C, Object, ...]super จากโมดูลที่แทรกไว้ด้านหน้า
เนื่องจากโมดูลที่แทรกไว้ด้านหน้าทำงานก่อน โมดูลจึงสามารถครอบเมธอดของคลาสได้โดยเรียก super เพื่อไปยังเมธอดเดิม วิธีนี้เหมาะอย่างยิ่งสำหรับตกแต่งพฤติกรรม
module Logged
def save
puts "before save"
result = super
puts "after save"
result
end
end
class Record
prepend Logged
def save
puts "saving record"
:ok
end
end
p Record.new.savesuper ในโมดูลเสริม
super จะเดินตามลำดับบรรพบุรุษ จากโมดูลที่รวมไว้ super จะไปถึงคลาสแม่ ส่วนจากโมดูลที่แทรกไว้ด้านหน้า จะไปถึงตัวคลาสเอง
module Polite
def greet; "Hi! " + super; end
end
class Person
prepend Polite
def greet; "I am here."; end
end
puts Person.new.greetครอบเมธอดโดยไม่ต้องแก้ไข
prepend ช่วยให้คุณเพิ่มพฤติกรรมรอบเมธอดเดิมได้โดยไม่ต้องแก้ไขโค้ดของคลาสต้นฉบับ เป็นทางเลือกที่สะอาดกว่าการแก้ไขคลาสจากภายนอก
module Timing
def compute(n)
puts "start"
super
end
end
class Calc
prepend Timing
def compute(n); n * n; end
end
puts Calc.new.compute(5)ลำดับของหลายโมดูล
เมื่อรวมหลายโมดูล โมดูลที่รวมเข้ามาเป็นลำดับสุดท้ายจะอยู่ใกล้คลาสที่สุดและถูกค้นหาเป็นลำดับแรก
module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
include A
include B
end
puts C.new.who # B wins (included last)
p C.ancestorsสรุป include เทียบกับ prepend
เปรียบเทียบกันโดยตรง:
include M: ลำดับคือ[Class, M, ...]— เมธอดของคลาสมีลำดับความสำคัญสูงกว่าprepend M: ลำดับคือ[M, Class, ...]— เมธอดของโมดูลมีลำดับความสำคัญสูงกว่า และสามารถเรียกsuperเข้าไปยังคลาสได้
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsนำทุกอย่างมารวมกัน
การค้นหาเมธอดจะทำตามลำดับบรรพบุรุษ:
- เมธอดของคลาสมีลำดับเหนือโมดูลที่รวมไว้
- โมดูลที่แทรกไว้ด้านหน้ามีลำดับเหนือคลาส
superจะเดินขึ้นไปหนึ่งขั้นในลำดับ
module Cap
def name; super.capitalize; end
end
class User
prepend Cap
def name; "ada"; end
end
puts User.new.nameตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการค้นหาเมธอด
ทบทวน
คุณได้เรียนรู้เกี่ยวกับการค้นหาเมธอดดังนี้:
- Ruby จะค้นหาลำดับบรรพบุรุษจากบนลงล่าง
includeอยู่ใต้คลาส ส่วนprependอยู่เหนือคลาสsuperจะไปยังคำจำกัดความถัดไปที่อยู่สูงขึ้นไปในลำดับprependใช้ครอบเมธอดได้อย่างสะอาด
module Loud
def speak; super.upcase; end
end
class Bot
prepend Loud
def speak; "beep"; end
end
puts Bot.new.speakคำถามที่พบบ่อย
บทเรียน “prepend และการค้นหาเมธอด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “prepend และการค้นหาเมธอด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “prepend และการค้นหาเมธอด”
สายโซ่บรรพบุรุษ คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “prepend และการค้นหาเมธอด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม
ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดมอดูล
- include และ extend
- Comparable และ Enumerable
- prepend และการค้นหาเมธอด