Indexieren und Anhängen
Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 39 von 57.
obj[key] ruft die Methode [] auf, und obj[key] = value ruft []= auf. Wenn du sie definierst, erhält eine Klasse die eckige-Klammer-Syntax von Arrays und Hashes, mit einer beliebigen passenden Bedeutung:
class Inventory
def initialize
@stock = Hash.new(0)
end
def [](name)
@stock[name]
end
def []=(name, qty)
@stock[name] = qty
end
end
inv = Inventory.new
inv["apple"] = 5
inv["apple"] += 2
puts inv["apple"]
puts inv["pear"]Ausgabe:
7
0[] kann mehrere Argumente entgegennehmen, zum Beispiel eine Zeile und eine Spalte, und sie überprüfen. IndexError ist der übliche Fehler für eine Position, die nicht existiert:
class Board
def initialize(size)
@size = size
@cells = Array.new(size) { Array.new(size, ".") }
end
def [](row, col)
check(row, col)
@cells[row][col]
end
def []=(row, col, mark)
check(row, col)
@cells[row][col] = mark
end
def check(row, col)
raise IndexError, "no cell #{row},#{col}" unless row.between?(0, @size - 1) && col.between?(0, @size - 1)
end
end
b = Board.new(3)
b[1, 1] = "X"
puts b[1, 1] + b[0, 0]
begin
b[3, 0]
rescue IndexError => e
puts e.message
endAusgabe:
X.
no cell 3,0<< ist der Anhängeoperator. Wenn du davon self zurückgibst, kannst du Aufrufe verketten, wie bei list << a << b für Arrays:
class Shelf
def initialize
@books = []
end
def <<(title)
@books << title
self
end
def to_s
@books.join(" | ")
end
end
shelf = Shelf.new
shelf << "Dune" << "Emma" << "Ulysses"
puts shelfAusgabe:
Dune | Emma | UlyssesEine Zuweisung über []= gibt den zugewiesenen Wert zurück, nicht den Rückgabewert der Methode, wie bei jedem Setter. Mit Klammern und << erhält eine Klasse eine kleine, vertraute Schnittstelle:
inv["apple"] = 5 # ruft []=("apple", 5) auf, der Ausdruck ist 5
inv["apple"] # ruft []("apple") auf
shelf << "Dune" << "Emma" # << gibt self zurück, sodass Aufrufe verkettet werden können
board[1, 2] = "X" # []=(1, 2, "X")Aufgabe
EinfachVervollständige die Klasse Inventory. inv[name] gibt die Menge eines Artikels zurück (bei unbekannten Artikeln 0), inv[name] = qty legt sie fest, und inv << name fügt ein Stück dieses Artikels hinzu und gibt das Inventar zurück, sodass Aufrufe verkettet werden können. to_s gibt apple: 3, pear: 1 in alphabetischer Reihenfolge der Namen zurück, lässt Artikel mit der Menge 0 weg oder gibt empty zurück.
Der bereitgestellte Code liest Befehle ein: set apple 5, add apple pear pear (wobei << für jeden Namen verkettet aufgerufen wird), get apple und print, und gibt das Ergebnis von get und print aus.
Dein Code gehört in inventory.rb. main.rb enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
require_relative 'inventory'
# Bereitgestellter Eingabe-/Ausgabecode: unverändert lassen
input = []
while (line = gets)
input << line.chomp
end
inv = Inventory.new
input.each do |line|
cmd, *args = line.split
case cmd
when "set" then inv[args[0]] = args[1].to_i
when "add" then args.reduce(inv) { |target, name| target << name }
when "get" then puts inv[args[0]]
else puts inv
end
end
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