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

Comparable และ Enumerable

มิกซ์อินมาตรฐาน

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

มิกซ์อินมาตรฐาน

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

puts Comparable.instance_methods.sort.inspect

คอมพาเรเบิลต้องมี <=>

Comparable ต้องการให้คุณกำหนดตัวดำเนินการยานอวกาศ <=> ซึ่งส่งคืนค่า -1, 0 หรือ 1 จากนั้นคุณจะได้รับ <, <=, ==, >, >= และ between?

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
end
puts Weight.new(50) < Weight.new(80)

เมธอดเปรียบเทียบที่มีให้โดยอัตโนมัติ

เมื่อกำหนดตัวดำเนินการเพียงตัวเดียว เมธอดเปรียบเทียบทั้งหมดก็จะทำงานได้ทันที

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
end
a = Weight.new(100)
b = Weight.new(100)
puts a == b
puts Weight.new(30).between?(Weight.new(10), Weight.new(50))

clamp จากโมดูลการเปรียบเทียบ

Comparable ยังมี clamp ซึ่งช่วยจำกัดค่าให้อยู่ภายในช่วงที่กำหนด

puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)

การเรียงลำดับวัตถุที่เปรียบเทียบได้

เมื่อกำหนด <=> ไว้แล้ว อาร์เรย์ของวัตถุเหล่านี้ก็จะเรียงลำดับโดยอัตโนมัติได้

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
  def to_s; "#{grams}g"; end
end
list = [Weight.new(30), Weight.new(10), Weight.new(20)]
puts list.sort.map(&:to_s).inspect

โมดูลการวนซ้ำต้องมี each

Enumerable กำหนดให้คุณต้องนิยาม each จากนั้นคุณจะได้ map, select, reduce, min, max, sort และอื่น ๆ อีกหลายสิบรายการ

class TodoList
  include Enumerable
  def initialize(*items); @items = items; end
  def each(&block); @items.each(&block); end
end
list = TodoList.new("buy milk", "call mom")
puts list.map(&:upcase).inspect

การรวมค่าที่ได้โดยไม่ต้องเขียนเพิ่ม

เมื่อมี each แล้ว เมธอดสำหรับรวมค่าอย่าง count, min และ include? ก็พร้อมใช้งาน

class Scores
  include Enumerable
  def initialize(*n); @n = n; end
  def each(&block); @n.each(&block); end
end
s = Scores.new(8, 3, 9, 4)
puts s.max
puts s.min
puts s.count

select และ reject

คุณยังได้เมธอดสำหรับกรองข้อมูลมาด้วย

class Numbers
  include Enumerable
  def initialize(*n); @n = n; end
  def each(&block); @n.each(&block); end
end
nums = Numbers.new(1, 2, 3, 4, 5, 6)
p nums.select(&:even?)
p nums.reject(&:even?)

reduce สำหรับหาผลรวม

reduce (ชื่อเรียกอีกชื่อคือ inject) ใช้รวมองค์ประกอบต่าง ๆ เช่น การหาผลรวม

class Basket
  include Enumerable
  def initialize(*p); @p = p; end
  def each(&block); @p.each(&block); end
end
b = Basket.new(10, 20, 30)
puts b.reduce(0) { |sum, price| sum + price }

รวมโมดูลเสริมทั้งสอง

เพิ่ม Comparable เพื่อการเรียงลำดับ และเพิ่ม Enumerable เพื่อการวนซ้ำ แล้วคลาสของคุณจะให้ความรู้สึกเหมือนคอลเลกชันในตัว

class Playlist
  include Enumerable
  def initialize(*songs); @songs = songs; end
  def each(&block); @songs.each(&block); end
end
pl = Playlist.new("c", "a", "b")
puts pl.sort.inspect
puts pl.first

นำทุกอย่างมารวมกัน

โมดูลเสริมมาตรฐานจะให้ประโยชน์มากมายจากข้อตกลงเล็ก ๆ ดังนี้:

  • Comparable: นิยาม <=> แล้วคุณจะได้การเปรียบเทียบทั้งหมด
  • Enumerable: นิยาม each แล้วคุณจะได้ชุดเครื่องมือสำหรับคอลเลกชันครบชุด
class Bag
  include Enumerable
  def initialize(*x); @x = x; end
  def each(&b); @x.each(&b); end
end
puts Bag.new(3, 1, 2).sort.inspect

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

ทดสอบความเข้าใจของคุณเกี่ยวกับโมดูลเสริมมาตรฐาน

ทบทวน

คุณได้เรียนรู้เกี่ยวกับโมดูลเสริมมาตรฐานดังนี้:

  • Comparable ต้องมี <=> และมอบการเปรียบเทียบ รวมถึง clamp และ between?
  • Enumerable ต้องมี each และมอบ map/select/reduce/ค่าต่ำสุด/ค่าสูงสุด รวมถึงอื่น ๆ อีกมากมาย
  • เมื่อใช้ร่วมกัน คลาสที่สร้างเองจะให้ความรู้สึกเหมือนเป็นคลาสในตัว
class Temp
  include Comparable
  attr_reader :deg
  def initialize(d); @deg = d; end
  def <=>(o); deg <=> o.deg; end
end
puts Temp.new(20) > Temp.new(15)

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

บทเรียน “Comparable และ Enumerable” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Comparable และ Enumerable”

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

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

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

บทเรียน “Comparable และ Enumerable” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การกำหนดมอดูล
  2. include และ extend
  3. Comparable และ Enumerable
  4. prepend และการค้นหาเมธอด
← กลับไปที่ Ruby Academy