Indexation et ajout
Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 39 sur 57.
obj[key] appelle la méthode [], et obj[key] = value appelle []=. Les définir donne à une classe la syntaxe entre crochets des tableaux et des hachages, avec la signification qui lui convient :
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"]Sortie :
7
0[] peut accepter plusieurs arguments, par exemple une ligne et une colonne, et il peut les vérifier. IndexError est l’erreur habituelle pour une position qui n’existe pas :
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
endSortie :
X.
no cell 3,0<< est l’opérateur d’ajout. Le fait de renvoyer self permet l’enchaînement, comme avec list << a << b sur les tableaux :
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 shelfSortie :
Dune | Emma | UlyssesUne affectation via []= renvoie la valeur affectée, et non ce que renvoie la méthode, comme avec n’importe quel setter. Les crochets et << donnent à une classe une petite interface familière :
inv["apple"] = 5 # appelle []=("apple", 5), l'expression est 5
inv["apple"] # appelle []("apple")
shelf << "Dune" << "Emma" # << retourne self, donc il s'enchaîne
board[1, 2] = "X" # []=(1, 2, "X")Défi
FacileComplétez la classe Inventory. inv[name] renvoie la quantité d’un article (0 lorsqu’il est inconnu), inv[name] = qty la définit, et inv << name ajoute une unité de cet article et renvoie l’inventaire afin de permettre l’enchaînement des appels. to_s renvoie apple: 3, pear: 1 en classant les noms par ordre alphabétique, en excluant les articles dont la quantité est égale à 0, ou empty.
Le code fourni lit des commandes : set apple 5, add apple pear pear (qui enchaîne << pour chaque nom), get apple et print, puis affiche le résultat de get et de print.
Votre code doit être placé dans inventory.rb. main.rb contient le code fourni d’entrée/sortie et ne peut pas être modifié.
Essayez vous-même
require_relative 'inventory'
# Code d'entrée/sortie fourni : le garder tel quel
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
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne