Ruby Academy · Lektion

Comparable och Enumerable

Standardiserade mixins.

Lektion 3 av 413 steg

Comparable och Enumerable är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Standardmixins

Ruby levereras med kraftfulla moduler som Ni kan mixa in i era egna klasser. Två särskilt användbara är Comparable och Enumerable. Var och en ger Er många metoder i utbyte mot att Ni implementerar en enda.

puts Comparable.instance_methods.sort.inspect

Comparable kräver <=>

Comparable kräver att Ni definierar spaceship-operatorn <=>, som returnerar -1, 0 eller 1. I gengäld får Ni <, <=, ==, >, >= och 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)

Jämförelsemetoder utan extra arbete

När en operator är definierad fungerar alla jämförelsemetoder automatiskt.

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 från Comparable

Comparable tillhandahåller även clamp, som håller ett värde inom ett intervall.

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

Sortering av Comparable-objekt

Eftersom <=> är definierad kan en array med era objekt sorteras automatiskt.

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 att ni definierar each. I gengäld får ni map, select, reduce, min, max, sort och dussintals metoder till.

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 på köpet

När each finns på plats blir aggregeringsmetoder som count, min och include? tillgängliga.

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 och reject

Filtreringsmetoder följer också med.

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 för totalsummor

reduce (aliaset inject) kombinerar element, till exempel genom att summera dem.

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 }

Kombinera båda mixins

Lägg till Comparable för sortering och Enumerable för iteration, så uppför sig klassen som en inbyggd 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

Så hänger det ihop

Standardmixins ger mycket i utbyte mot ett litet kontrakt:

  • Comparable: definiera <=> och få alla jämförelseoperatorer.
  • Enumerable: definiera each och få hela verktygslådan för samlingar.
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

Snabbtest

Testa era kunskaper om standardmixins.

Sammanfattning

Ni har lärt er om standardmixins:

  • Comparable kräver <=> och ger jämförelser samt clamp och between?.
  • Enumerable kräver each och ger map/select/reduce/min/max med mera.
  • Tillsammans får anpassade klasser att uppföra sig som inbyggda.
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 att börja

Lär dig Ruby med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
109

Vanliga frågor

Är lektionen ”Comparable och Enumerable” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”Comparable och Enumerable”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Comparable och Enumerable”?

Standardiserade mixins. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?

Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Comparable och Enumerable”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Ruby Academy-lektionen?

Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Definiera moduler
  2. include och extend
  3. Comparable och Enumerable
  4. prepend och metodupplösning
← Tillbaka till Ruby Academy