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

การเขียน each แบบกำหนดเอง

นำการวนซ้ำไปใช้งาน

การเขียน each แบบกำหนดเอง เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

สร้างการวนซ้ำ

การวนซ้ำของ Ruby ขับเคลื่อนด้วยเมธอดเดียวคือ each เมื่อเขียน each ของคุณเอง คุณจะกำหนดวิธีการเดินผ่านคอลเลกชันและเปิดใช้ระบบนิเวศของการวนซ้ำทั้งหมดได้

class Trio
  def each
    yield 1
    yield 2
    yield 3
  end
end
Trio.new.each { |n| puts n }

each ส่งค่าออกมา

ภายใน each ให้เรียก yield หนึ่งครั้งต่อองค์ประกอบ บล็อกที่ผู้เรียกส่งมาจะได้รับค่าแต่ละค่าตามลำดับ

class Days
  NAMES = ["Mon", "Tue", "Wed"]
  def each
    NAMES.each { |d| yield d }
  end
end
Days.new.each { |day| puts day }

จัดเก็บข้อมูลภายใน

โดยทั่วไป each จะเดินผ่านข้อมูลที่เก็บอยู่ในตัวแปรอินสแตนซ์

class Stack
  def initialize
    @items = []
  end
  def push(x); @items << x; self; end
  def each
    @items.each { |i| yield i }
  end
end
s = Stack.new
s.push(10).push(20)
s.each { |x| puts x }

ลำดับการเดินผ่านแบบกำหนดเอง

each ของคุณสามารถวนซ้ำในลำดับใดก็ได้ตามต้องการ เช่น ย้อนกลับลำดับ

class Reversed
  def initialize(arr); @arr = arr; end
  def each
    i = @arr.length - 1
    while i >= 0
      yield @arr[i]
      i -= 1
    end
  end
end
Reversed.new([1, 2, 3]).each { |x| puts x }

ส่งค่าหลายค่า

yield สามารถส่งได้มากกว่าหนึ่งค่า โดยบล็อกจะได้รับค่าเหล่านั้นเป็นพารามิเตอร์หลายตัว เช่น คีย์และค่าของแฮช

class Pairs
  def each
    yield :a, 1
    yield :b, 2
  end
end
Pairs.new.each { |key, value| puts "#{key}=#{value}" }

each คืนค่า self

ตามธรรมเนียมแล้ว each จะคืนค่าคอลเลกชันเองเพื่อให้สามารถต่อการเรียกได้ การคืนค่า self จาก each สอดคล้องกับพฤติกรรมในตัว

class Box
  def initialize(*x); @x = x; end
  def each
    @x.each { |i| yield i }
    self
  end
end
result = Box.new(1, 2).each { |i| }
puts result.class

ใช้ block_given?

ควรป้องกันกรณีไม่มีบล็อก เพื่อไม่ให้การเรียก each เปล่า ๆ ทำให้เกิดข้อผิดพลาด โดยมักคืนค่าตัวแจงนับแทน ซึ่งจะกล่าวถึงในภายหลัง

class List
  def initialize(*x); @x = x; end
  def each
    return @x.to_enum unless block_given?
    @x.each { |i| yield i }
  end
end
puts List.new(5, 6).each.class

ขับเคลื่อนเมธอดอื่น

เมื่อมี each แล้ว คุณสามารถสร้างเมธอดอื่น ๆ บนพื้นฐานของมันภายในคลาสเดียวกันได้

class Numbers
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
  def total
    sum = 0
    each { |i| sum += i }
    sum
  end
end
puts Numbers.new(1, 2, 3, 4).total

ลำดับค่าที่คำนวณขึ้น

each ไม่จำเป็นต้องจัดเก็บข้อมูลใด ๆ เพราะสามารถสร้างค่าขึ้นระหว่างทำงานได้

class Evens
  def initialize(limit); @limit = limit; end
  def each
    n = 0
    while n <= @limit
      yield n
      n += 2
    end
  end
end
Evens.new(8).each { |x| puts x }

รากฐานของโมดูลการวนซ้ำ

each ของคุณคือหน่วยพื้นฐานเพียงหนึ่งเดียวที่ Enumerable ต้องการ ในบทเรียนถัดไป คุณจะรวมโมดูลนี้และได้เมธอดอีกหลายสิบรายการโดยไม่ต้องเขียนเพิ่ม

class Range3
  def each
    (1..3).each { |n| yield n }
  end
end
Range3.new.each { |n| print n }
puts

นำทุกอย่างมารวมกัน

each แบบกำหนดเองช่วยให้คุณควบคุมการวนซ้ำได้อย่างเต็มที่:

  • yield หนึ่งครั้งต่อองค์ประกอบ
  • เดินผ่านข้อมูลในลำดับใดก็ได้ สร้างค่าขึ้นเอง หรือส่งคู่ค่า
  • คืนค่า self ตามธรรมเนียม
class Countdown
  def initialize(from); @from = from; end
  def each
    @from.downto(1) { |n| yield n }
  end
end
Countdown.new(3).each { |n| puts n }

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับ each แบบกำหนดเอง

ทบทวน

คุณได้เรียนรู้การเขียน each แบบกำหนดเอง:

  • yield ส่งองค์ประกอบไปยังบล็อกของผู้เรียก
  • คุณควบคุมลำดับการเดินผ่านข้อมูลและสามารถสร้างค่าได้
  • คืนค่า self ตามธรรมเนียม
  • each เป็นรากฐานของ Enumerable
class Squares
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
Squares.new(4).each { |sq| puts sq }

คำถามที่พบบ่อย

บทเรียน “การเขียน each แบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเขียน each แบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเขียน each แบบกำหนดเอง”

นำการวนซ้ำไปใช้งาน คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การเขียน each แบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม

ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การเขียน each แบบกำหนดเอง
  2. การรวม Enumerable
  3. ตัววนซ้ำแบบขี้เกียจ
  4. ออบเจ็กต์ Enumerator
← กลับไปที่ Ruby Academy