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.countselect และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดมอดูล
- include และ extend
- Comparable และ Enumerable
- prepend และการค้นหาเมธอด