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

การรวม 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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