Comparable og Enumerable
Standard-mixins
Comparable og Enumerable er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.
Standardmixins
Ruby leverer kraftfulde moduler, som du kan blande ind i dine egne klasser. To særligt nyttige er Comparable og Enumerable. Hver af dem giver dig mange metoder til gengæld for, at du kun implementerer én.
puts Comparable.instance_methods.sort.inspectComparable kræver <=>
Comparable kræver, at du definerer spaceship-operatoren <=>, som returnerer -1, 0 eller 1. Til gengæld får du <, <=, ==, >, >= og 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)Automatiske sammenligningsmetoder
Når én operator er defineret, fungerer alle sammenligningsmetoderne automatisk.
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 fra Comparable
Comparable giver også clamp, som holder en værdi inden for et interval.
puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)Sortering af Comparable-objekter
Fordi <=> er defineret, kan et array med dine objekter sorteres automatisk.
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).inspectEnumerable kræver each
Enumerable kræver, at du definerer each. Til gengæld får du map, select, reduce, min, max, sort og dusinvis af andre metoder.
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).inspectAggregering uden ekstra arbejde
Når each er på plads, er aggregeringsmetoder som count, min og include? tilgængelige.
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 og reject
Du får også metoder til filtrering.
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 til totaler
reduce (aliaset inject) kombinerer elementer, for eksempel ved at lægge dem sammen.
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 }Kombinér de to mixins
Tilføj Comparable til sortering og Enumerable til iteration, så føles din klasse som en indbygget samling.
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.firstSamlet overblik
Standard-mixins belønner en lille kontrakt:
Comparable: definér<=>, og få alle sammenligninger.Enumerable: definéreach, og få hele værktøjskassen til samlinger.
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.inspectHurtigt tjek
Test din forståelse af standard-mixins.
Opsummering
Du har lært om standard-mixins:
Comparablekræver<=>og giver sammenligning samtclampogbetween?.Enumerablekrævereachog giver map, select, reduce, min, max og meget mere.- Sammen får de brugerdefinerede klasser til at føles indbyggede.
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)Lær Ruby med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 29
- Lektioner
- 109
Ofte stillede spørgsmål
Er lektionen “Comparable og Enumerable” gratis?
Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “Comparable og Enumerable”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Comparable og Enumerable”?
Standard-mixins Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Ruby Academy?
Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Comparable og Enumerable”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Ruby Academy-lektion?
Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Definition af moduler
- include og extend
- Comparable og Enumerable
- prepend og method resolution