0Pricing
Ruby Academy · บทเรียน

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.hello

include อยู่ใต้คลาส

โมดูลที่ใช้ 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.hello

prepend ในลำดับ

ตรวจสอบบรรพบุรุษเพื่อดูว่า 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.save

super ในโมดูลเสริม

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดมอดูล
  2. include และ extend
  3. Comparable และ Enumerable
  4. prepend และการค้นหาเมธอด
← กลับไปที่ Ruby Academy