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

ออบเจ็กต์ Enumerator

การวนซ้ำจากภายนอก

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

การวนซ้ำจากภายนอก

ตัวแจงนับ คือวัตถุที่แสดงการวนซ้ำ และรองรับการวนซ้ำจาก ภายนอก โดยคุณดึงค่าทีละค่าด้วย next แทนการส่งบล็อกให้ each

enum = [10, 20, 30].each
puts enum.next
puts enum.next

รับตัวแจงนับ

เรียกเมธอดวนซ้ำอย่าง each โดยไม่ส่งบล็อก แล้วคุณจะได้รับตัวแจงนับแทนการเริ่มทำงานทันที

enum = [1, 2, 3].each
puts enum.class

ดึงค่าด้วย next

next จะคืนค่าองค์ประกอบถัดไปทุกครั้งที่คุณเรียกใช้ ตัวแจงนับจะจดจำตำแหน่งปัจจุบันไว้

letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.next

StopIteration เมื่อถึงจุดสิ้นสุด

เมื่อไม่มีค่าเหลือแล้ว next จะทำให้เกิด StopIteration คุณสามารถดักจับข้อผิดพลาดนี้เพื่อหยุดการทำงานอย่างเรียบร้อย

enum = [1, 2].each
begin
  loop { puts enum.next }
rescue StopIteration
  puts "done"
end

peek และ rewind

peek จะดูค่าถัดไปโดยไม่เลื่อนตำแหน่ง ส่วน rewind จะรีเซ็ตกลับไปยังจุดเริ่มต้น

enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.next

สร้างตัวแจงนับแบบกำหนดเอง

สร้างตัวแจงนับของคุณเองด้วย Enumerator.new บล็อกจะได้รับตัวส่งค่า y ให้ส่งค่าด้วย y << หรือ y.yield

evens = Enumerator.new do |y|
  n = 0
  loop do
    y << n
    n += 2
  end
end
puts evens.next
puts evens.next
puts evens.next

ตัวแจงนับที่ไม่มีที่สิ้นสุด

เนื่องจากตัวแจงนับแบบกำหนดเองใช้การดึงค่า จึงสามารถทำงานได้ไม่รู้จบ คุณจะดึงมาเฉพาะค่าที่ต้องการเท่านั้น

counter = Enumerator.new do |y|
  i = 1
  loop { y << i; i += 1 }
end
p counter.first(5)

ตัวแจงนับรองรับการวนซ้ำ

ตัวแจงนับรวมโมดูลการวนซ้ำไว้ด้วย ดังนั้นเมธอดทั่วไปอย่าง map, select และ take จึงใช้งานได้เช่นกัน ทำให้สามารถผสานการวนซ้ำจากภายในและภายนอกได้

fib = Enumerator.new do |y|
  a, b = 0, 1
  loop do
    y << a
    a, b = b, a + b
  end
end
p fib.take(8)

with_index

with_index จะเพิ่มดัชนีให้กับตัวแจงนับใด ๆ และเลือกกำหนดหมายเลขเริ่มต้นเองได้

["x", "y", "z"].each.with_index(1) do |item, i|
  puts "#{i}: #{item}"
end

คืนค่าตัวแจงนับจาก each

ในคลาสของคุณเอง ให้คืนค่า to_enum(:each) (หรือ enum_for) เมื่อไม่มีบล็อกส่งมา เพื่อให้ผู้เรียกสามารถวนซ้ำจากภายนอกได้

class Trio
  def each
    return to_enum(:each) unless block_given?
    yield 1; yield 2; yield 3
  end
end
e = Trio.new.each
puts e.next
puts e.next

การนำทุกอย่างมาประกอบกัน

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

  • ดึงค่าด้วย next ตรวจดูค่าถัดไป หรือย้อนกลับได้
  • สร้างตัววนซ้ำแบบกำหนดเองด้วย Enumerator.new และตัวส่งค่า
  • ตัววนซ้ำเหล่านี้รองรับการทำงานกับชุดข้อมูล จึงใช้การแปลง การเลือก และการหยิบค่าได้ทั้งหมด
odds = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 2 }
end
p odds.first(4)

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

ทดสอบความเข้าใจของคุณเกี่ยวกับอ็อบเจ็กต์ Enumerator

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับอ็อบเจ็กต์ Enumerator ดังนี้:

  • การวนซ้ำจากภายนอกด้วย next การตรวจดูค่าถัดไป และ rewind
  • StopIteration ใช้ส่งสัญญาณเมื่อสิ้นสุด
  • สร้างตัววนซ้ำแบบกำหนดเองด้วย Enumerator.new { |y| ... }
  • ตัววนซ้ำเหล่านี้รองรับการทำงานกับชุดข้อมูล และอาจทำงานแบบไม่มีที่สิ้นสุดได้
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.next

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

บทเรียน “ออบเจ็กต์ Enumerator” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ออบเจ็กต์ Enumerator”

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

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

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

บทเรียน “ออบเจ็กต์ Enumerator” ใช้เวลานานแค่ไหน

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

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

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

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

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