Własne kolekcje
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 40 z 57.
Klasa kolekcji łączy kilka specjalnych metod: each z Enumerable, << do dodawania, size oraz to_s i inspect do wyświetlania. each powinna też działać bez bloku, zwracając enumerator za pomocą to_enum, tak jak robią to tablice:
class TodoList
include Enumerable
def initialize
@items = []
end
def <<(item)
@items << item
self
end
def each
return to_enum(:each) unless block_given?
@items.each { |item| yield item }
self
end
end
list = TodoList.new << "wash" << "shop" << "cook"
list.each.with_index(1) { |item, n| puts "#{n}. #{item}" }
p list.select { |i| i.include?("o") }Wynik:
1. wash
2. shop
3. cook
["shop", "cook"]block_given? informuje, czy wywołujący przekazał blok. Enumerator zwrócony bez bloku obsługuje łańcuchowe wywołania, takie jak each.with_index, each_slice lub next:
class Countdown
include Enumerable
def initialize(from)
@from = from
end
def each
return to_enum(:each) unless block_given?
@from.downto(1) { |n| yield n }
end
end
e = Countdown.new(3).each
puts e.next
puts e.next
p Countdown.new(5).each_slice(2).to_aWynik:
3
2
[[5, 4], [3, 2], [1]]to_s to przyjazny dla użytkowników tekst, a inspect to krótkie podsumowanie dla programistów. W przypadku kolekcji inspect zwykle pokazuje klasę i rozmiar zamiast każdego elementu:
class TodoList
include Enumerable
def initialize(*items)
@items = items
end
def each(&block)
@items.each(&block)
end
def size
@items.size
end
def to_s
map.with_index(1) { |item, n| "#{n}. #{item}" }.join("\n")
end
def inspect
"#<TodoList #{size} items>"
end
end
list = TodoList.new("wash", "shop")
puts list
p listWynik:
1. wash
2. shop
#<TodoList 2 elementy>Enumerable udostępnia count, ale nie size, empty?, << ani []: należą one do klasy, ponieważ tylko ona wie, jak przechowywane są elementy. Zdefiniowanie ich sprawia, że kolekcja zachowuje się dla wywołujących ją obiektów jak tablica:
def size
@items.size
end
def empty?
@items.empty?
end
def [](index)
@items[index]
endWyzwanie
ŁatwyUzupełnij klasę TodoList. << dodaje tekst zadania i zwraca listę. each przekazuje zadania i bez bloku zwraca to_enum(:each). Dołącz Enumerable. size zwraca liczbę zadań. to_s zwraca zadania w postaci ponumerowanych wierszy, 1. wash lub nothing to do, a inspect zwraca #<TodoList 3 items>.
Dostarczony kod dodaje każdy wiersz wejściowy, łącząc operacje <<, a następnie wyświetla listę, wynik p dla listy, zadania ponumerowane przy użyciu ! przez each.with_index(1), na przykład 1! wash, liczbę zadań zawierających o oraz pierwsze zadanie w kolejności alfabetycznej.
Umieść swój kod w pliku todo_list.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'todo_list'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
list = input.reduce(TodoList.new) { |l, task| l << task }
puts list
p list
list.each.with_index(1) { |task, n| puts "#{n}! #{task}" }
puts "with o: #{list.count { |t| t.include?("o") }}"
puts "first: #{list.min}"
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ążekPoćwicz samodzielnie: Kompilator Ruby online