Benutzerdefinierte Collections
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 40 von 57.
Eine Sammlungsklasse kombiniert mehrere spezielle Methoden: each mit Enumerable, << zum Hinzufügen, size sowie to_s und inspect zur Ausgabe. each sollte auch ohne Block funktionieren und mit to_enum einen Enumerator zurückgeben, wie es Arrays tun:
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") }Ausgabe:
1. wash
2. shop
3. cook
["shop", "cook"]block_given? gibt an, ob der Aufrufer einen Block übergeben hat. Der Enumerator, der ohne einen Block zurückgegeben wird, unterstützt Verkettungen wie each.with_index, each_slice oder 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_aAusgabe:
3
2
[[5, 4], [3, 2], [1]]to_s ist der benutzerfreundliche Text für Nutzer und inspect eine kurze Zusammenfassung für Programmierer. Bei einer Sammlung zeigt inspect üblicherweise die Klasse und die Größe statt jedes einzelnen Elements an:
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 listAusgabe:
1. wash
2. shop
#<TodoList 2 items>Enumerable stellt count bereit, aber nicht size, empty?, << oder []: Diese gehören zur Klasse, denn nur sie weiß, wie die Elemente gespeichert werden. Wenn du sie definierst, fühlt sich die Sammlung für ihre Aufrufer wie ein Array an:
def size
@items.size
end
def empty?
@items.empty?
end
def [](index)
@items[index]
endAufgabe
EinfachVervollständige die Klasse TodoList. << fügt einen Aufgabentext hinzu und gibt die Liste zurück. each gibt die Aufgaben aus und gibt ohne Block to_enum(:each) zurück. Binde Enumerable ein. size gibt die Anzahl der Aufgaben zurück. to_s gibt die Aufgaben als nummerierte Zeilen zurück, 1. wash oder nothing to do, und inspect gibt #<TodoList 3 items> zurück.
Der bereitgestellte Code fügt jede Eingabezeile durch Verkettung von << hinzu und gibt dann die Liste, p der Liste, die mit ! nummerierten Aufgaben über each.with_index(1) als 1! wash, die Anzahl der Aufgaben, die o enthalten, und die alphabetisch erste Aufgabe aus.
Dein Code gehört in todo_list.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
require_relative 'todo_list'
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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}"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler