Moduł Enumerable
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 30 z 57.
Enumerable to moduł stojący za metodami kolekcji tablic i hashy. Klasa, która definiuje each, zwracając swoje elementy jeden po drugim, i dołącza Enumerable, otrzymuje metody map, select, count, sort_by, min_by, sum, include? i dziesiątki innych:
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")Wynik:
INTRO, DUNE, OUTRO
["Intro", "Outro"]
3
trueyield przekazuje wartość do bloku, który wywołujący przekazał do each. Klasa decyduje, czym jest jeden element, na przykład wierszem tekstu, parą wartości lub jednym z własnych obiektów:
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 }Wynik:
["apple", "plum"]
["plum", 7]Elementy nie muszą być przechowywane. each może je obliczać na bieżąco, a metody takie jak first wcześniej kończą pętlę:
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).sumWynik:
[1, 4, 9, 16, 25, 36, 49]
[1, 4, 9]
385Gdy elementy definiują <=>, metody sortowania z Enumerable, takie jak sort, min i max, działają bez bloku. W przeciwnym razie wymagają bloku, tak jak sort_by i min_by:
class Team
include Enumerable
def each(&block)
@players.each(&block) # przekaż blok bezpośrednio dalej
end
end
team.sort_by(&:age)
team.min_by(&:score)Wyzwanie
ŁatwyUzupełnij klasę Playlist. Przechowuje ona obiekty Song (z polami title i seconds) dodawane za pomocą add, dołącza Enumerable i definiuje each, które przekazuje każdą piosenkę w kolejności dodania.
Dostarczony kod dodaje jedną piosenkę na każdy wiersz wejściowy (title,seconds), a następnie używa wyłącznie metod Enumerable na playliście: wyświetla liczbę piosenek, tytuły połączone przecinkami, łączny czas w formacie m:ss, najdłuższy tytuł oraz tytuły piosenek dłuższych niż 3 minuty, posortowane alfabetycznie (lub none).
Twój kod umieść w plikach song.rb i playlist.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'song'
require_relative 'playlist'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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(", ")}"
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Metody i zmienne klasowe
Metody klasoweZmienne instancji klasyStałeMetody fabrykującePodsumowanie – kody kuponów6Moduły i mixiny
Moduły i includeRozszerzanie obiektówModuł ComparableModuł EnumerablePowtórzenie — liga sportowaPoćwicz samodzielnie: Kompilator Ruby online