Indeksowanie i dodawanie
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 39 z 57.
obj[key] wywołuje metodę [], a obj[key] = value wywołuje []=. Zdefiniowanie tych metod nadaje klasie składnię nawiasów kwadratowych tablic i hashy, z dowolnym znaczeniem, które jej odpowiada:
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"]Wynik:
7
0[] może przyjmować kilka argumentów, na przykład wiersz i kolumnę, i może je sprawdzać. IndexError to typowy błąd oznaczający pozycję, która nie istnieje:
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
endWynik:
X.
no cell 3,0<< to operator dopisywania. Zwrócenie z niego self umożliwia łączenie wywołań, tak jak list << a << b w przypadku tablic:
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 shelfWynik:
Dune | Emma | UlyssesPrzypisanie za pomocą []= zwraca przypisaną wartość, a nie to, co zwraca metoda, tak jak każdy setter. Nawiasy kwadratowe i << zapewniają klasie niewielki, znajomy interfejs:
inv["apple"] = 5 # wywołuje []=("apple", 5), a wartością wyrażenia jest 5
inv["apple"] # wywołuje []("apple")
shelf << "Dune" << "Emma" # << zwraca self, więc można łączyć wywołania w łańcuch
board[1, 2] = "X" # []=(1, 2, "X")Wyzwanie
ŁatwyUzupełnij klasę Inventory. inv[name] zwraca ilość danego elementu (0, jeśli jest nieznany), inv[name] = qty ją ustawia, a inv << name dodaje jeden taki element i zwraca stan magazynu, dzięki czemu można łączyć wywołania. to_s zwraca apple: 3, pear: 1 w kolejności alfabetycznej nazw, pomijając elementy o ilości 0, lub empty.
Dostarczony kod odczytuje polecenia: set apple 5, add apple pear pear (które łączy wywołania << dla każdej nazwy), get apple i print, a następnie wypisuje wynik poleceń get i print.
Twój kod umieść w pliku inventory.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'inventory'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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
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