การเขียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียน each แบบกำหนดเอง
- การรวม Enumerable
- ตัววนซ้ำแบบขี้เกียจ
- ออบเจ็กต์ Enumerator