ออบเจ็กต์ 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.nextStopIteration เมื่อถึงจุดสิ้นสุด
เมื่อไม่มีค่าเหลือแล้ว next จะทำให้เกิด StopIteration คุณสามารถดักจับข้อผิดพลาดนี้เพื่อหยุดการทำงานอย่างเรียบร้อย
enum = [1, 2].each
begin
loop { puts enum.next }
rescue StopIteration
puts "done"
endpeek และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียน each แบบกำหนดเอง
- การรวม Enumerable
- ตัววนซ้ำแบบขี้เกียจ
- ออบเจ็กต์ Enumerator