การรวม Enumerable
ใช้ map/select ได้ทันที
การรวม Enumerable เป็นบทเรียน Ruby Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ruby Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
รับ map/select ได้โดยไม่ต้องเขียนเพิ่ม
เมื่อคลาสของคุณมี each แล้ว การเพิ่มโมดูลเสริม Enumerable จะมอบ map, select, reduce, sort, min, max และอื่น ๆ อีกมากมายให้ทันที โดยทั้งหมดสร้างอยู่บน each ของคุณ
class Bag
include Enumerable
def initialize(*x); @x = x; end
def each; @x.each { |i| yield i }; end
end
p Bag.new(1, 2, 3).map { |n| n * 10 }ข้อตกลง
ข้อตกลงนั้นเรียบง่าย: รวม Enumerable และนิยาม each โมดูล Enumerable จะเรียก each ของคุณภายในเพื่อขับเคลื่อนทุกสิ่งที่เหลือ
class Squares
include Enumerable
def initialize(n); @n = n; end
def each
(1..@n).each { |i| yield i * i }
end
end
p Squares.new(5).to_aกรองด้วย select
select จะเก็บองค์ประกอบที่บล็อกคืนค่าเป็นจริง ส่วน reject จะทำตรงกันข้าม
class Nums
include Enumerable
def initialize(*x); @x = x; end
def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5, 6)
p n.select(&:even?)
p n.reject(&:even?)รวมค่าด้วย reduce
reduce จะพับคอลเลกชันให้เหลือค่าเดียว
class Cart
include Enumerable
def initialize(*p); @p = p; end
def each; @p.each { |i| yield i }; end
end
puts Cart.new(5, 10, 15).reduce(:+)ค่าต่ำสุด ค่าสูงสุด และการเรียงลำดับ
เมธอดที่อาศัยการเปรียบเทียบจะทำงานได้ตราบใดที่องค์ประกอบของคุณสามารถเปรียบเทียบกันได้
class Scores
include Enumerable
def initialize(*n); @n = n; end
def each; @n.each { |i| yield i }; end
end
s = Scores.new(7, 2, 9, 4)
puts s.min
puts s.max
p s.sortค้นหาและตรวจสมาชิก
find จะคืนค่าองค์ประกอบแรกที่ตรงกัน ส่วน include? จะตรวจสอบการเป็นสมาชิก
class Words
include Enumerable
def initialize(*w); @w = w; end
def each; @w.each { |x| yield x }; end
end
w = Words.new("cat", "dog", "bird")
puts w.find { |x| x.length == 4 }
puts w.include?("dog")จัดกลุ่มและแบ่งพาร์ทิชัน
โมดูลการวนซ้ำมีเครื่องมือช่วยจัดกลุ่มที่ทรงพลัง
class Nums
include Enumerable
def initialize(*x); @x = x; end
def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5)
p n.group_by(&:even?)
p n.partition(&:odd?)การเรียงลำดับต้องใช้องค์ประกอบที่เปรียบเทียบได้
หากองค์ประกอบของคุณเป็นวัตถุที่สร้างเอง ให้กำหนด <=> ให้กับวัตถุเหล่านั้น (ผ่านโมดูลการเปรียบเทียบ) เพื่อให้ sort, min และ max ทราบวิธีจัดลำดับ
Item = Struct.new(:price) do
include Comparable
def <=>(o); price <=> o.price; end
end
class Shelf
include Enumerable
def initialize(*i); @i = i; end
def each; @i.each { |x| yield x }; end
end
shelf = Shelf.new(Item.new(30), Item.new(10), Item.new(20))
p shelf.min.priceวนซ้ำพร้อมดัชนี
โมดูลการวนซ้ำยังมี each_with_index และ each_with_object สำหรับการวนซ้ำที่ละเอียดขึ้น
class Letters
include Enumerable
def initialize(*l); @l = l; end
def each; @l.each { |x| yield x }; end
end
Letters.new("a", "b", "c").each_with_index do |letter, i|
puts "#{i}: #{letter}"
endต่อเมธอดเข้าด้วยกัน
เนื่องจากเมธอดเหล่านี้คืนค่าเป็นอาร์เรย์หรือตัวแจงนับ คุณจึงสามารถต่อเมธอดเหล่านี้เป็นสายการประมวลผลที่สื่อความหมายได้
class Nums
include Enumerable
def initialize(*x); @x = x; end
def each; @x.each { |i| yield i }; end
end
result = Nums.new(1, 2, 3, 4, 5, 6).select(&:even?).map { |n| n * n }
p resultนำทุกอย่างมารวมกัน
การรวมโมดูลการวนซ้ำให้ประโยชน์อย่างมาก:
- นิยาม
eachเพียงครั้งเดียว - ได้ map, select, reduce, sort, find, group_by และอื่น ๆ อีกหลายสิบรายการ
- เพิ่มโมดูลการเปรียบเทียบให้กับองค์ประกอบเพื่อใช้เมธอดจัดลำดับ
class Range5
include Enumerable
def each; (1..5).each { |n| yield n }; end
end
puts Range5.new.sumตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับการรวมโมดูลการวนซ้ำ
ทบทวน
คุณได้เรียนรู้การรวมโมดูลการวนซ้ำ:
- นิยาม
eachแล้วรวมโมดูลเพื่อรับชุดเครื่องมือครบถ้วน - map/select/reduce/find/group_by ทั้งหมดทำงานบน
eachของคุณ - การจัดลำดับองค์ประกอบต้องใช้
<=> - สามารถต่อเมธอดเป็นสายการประมวลผลได้
class Tens
include Enumerable
def each; [10, 20, 30].each { |n| yield n }; end
end
p Tens.new.map { |n| n + 1 }คำถามที่พบบ่อย
บทเรียน “การรวม Enumerable” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การรวม Enumerable” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ruby Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ruby Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การรวม Enumerable”
ใช้ map/select ได้ทันที คุณปฏิบัติ Ruby Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ruby Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ruby Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การรวม Enumerable” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Ruby Academy นี้ได้ไหม
ได้ บทเรียน Ruby Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียน each แบบกำหนดเอง
- การรวม Enumerable
- ตัววนซ้ำแบบขี้เกียจ
- ออบเจ็กต์ Enumerator