Il modulo Enumerable
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 30 di 57.
Enumerable è il modulo alla base dei metodi di raccolta di array e hash. Una classe che definisce each, restituendo i propri elementi uno alla volta, e include Enumerable ottiene map, select, count, sort_by, min_by, sum, include? e decine di altri metodi:
class Playlist
include Enumerable
def initialize(*songs)
@songs = songs
end
def each
@songs.each { |song| yield song }
end
end
list = Playlist.new("Intro", "Dune", "Outro")
puts list.map(&:upcase).join(", ")
puts list.select { |s| s.size > 4 }.inspect
puts list.count
puts list.include?("Dune")Output:
INTRO, DUNE, OUTRO
["Intro", "Outro"]
3
trueyield passa un valore al blocco fornito dal chiamante a each. La classe decide che cosa sia un elemento, per esempio una riga di testo, una coppia di valori o uno dei suoi oggetti:
class Inventory
include Enumerable
def initialize
@stock = { "apple" => 3, "pear" => 0, "plum" => 7 }
end
def each
@stock.each { |name, qty| yield name, qty }
end
end
inv = Inventory.new
p inv.select { |_, qty| qty.positive? }.map(&:first)
p inv.max_by { |_, qty| qty }Output:
["apple", "plum"]
["plum", 7]Gli elementi non devono essere memorizzati. each può calcolarli man mano, e metodi come first interrompono il ciclo in anticipo:
class Squares
include Enumerable
def initialize(limit)
@limit = limit
end
def each
n = 1
while n * n <= @limit
yield n * n
n += 1
end
end
end
p Squares.new(50).to_a
p Squares.new(1000).first(3)
puts Squares.new(100).sumOutput:
[1, 4, 9, 16, 25, 36, 49]
[1, 4, 9]
385Quando gli elementi definiscono <=>, i metodi di ordinamento di Enumerable, come sort, min e max, funzionano senza un blocco. Altrimenti ne richiedono uno, come sort_by e min_by:
class Team
include Enumerable
def each(&block)
@players.each(&block) # passa il blocco direttamente
end
end
team.sort_by(&:age)
team.min_by(&:score)Sfida
FacileCompleta la classe Playlist. Contiene oggetti Song (con title e seconds) aggiunti con add, include Enumerable e definisce each, che restituisce ogni brano nell'ordine in cui è stato aggiunto.
Il codice fornito aggiunge un brano per ogni riga di input (title,seconds) e poi usa solo i metodi di Enumerable sulla playlist: stampa il numero di brani, i titoli uniti da virgole, la durata totale nel formato m:ss, il titolo del brano più lungo e i titoli dei brani che durano più di 3 minuti, in ordine alfabetico (oppure none).
Il tuo codice va in song.rb e playlist.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'song'
require_relative 'playlist'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
list = Playlist.new
input.each do |line|
title, seconds = line.split(",")
list.add(Song.new(title, seconds.to_i))
end
total = list.sum(&:seconds)
long = list.select { |s| s.seconds > 180 }.map(&:title).sort
puts "songs: #{list.count}"
puts "titles: #{list.map(&:title).join(", ")}"
puts format("total: %d:%02d", total / 60, total % 60)
puts "longest: #{list.max_by(&:seconds).title}"
puts "over 3 min: #{long.empty? ? "none" : long.join(", ")}"
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libri3Metodi e variabili di classe
Metodi di classeVariabili di istanza della classeCostantiMetodi factoryRiepilogo - Codici coupon6Moduli e mixin
Moduli e includeEstendere gli oggettiIl modulo ComparableIl modulo EnumerableRiepilogo - Lega sportivaEsercitati da solo: Compilatore Ruby online