Ruby Academy · Lektion

Comparable og Enumerable

Standard-mixins

Lektion 3 af 413 trin

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.inspect

Comparable 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).inspect

Enumerable 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).inspect

Aggregering 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.count

select 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.first

Samlet overblik

Standard-mixins belønner en lille kontrakt:

  • Comparable: definér <=>, og få alle sammenligninger.
  • Enumerable: definér each, 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.inspect

Hurtigt tjek

Test din forståelse af standard-mixins.

Opsummering

Du har lært om standard-mixins:

  • Comparable kræver <=> og giver sammenligning samt clamp og between?.
  • Enumerable kræver each og 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)
Gratis at komme i gang

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

  1. Definition af moduler
  2. include og extend
  3. Comparable og Enumerable
  4. prepend og method resolution
← Tilbage til Ruby Academy