Indexación y adición
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 39 de 57.
obj[key] llama al método [], y obj[key] = value llama a []=. Definirlos proporciona a una clase la sintaxis de corchetes de los arrays y hashes, con el significado que corresponda:
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"]Salida:
7
0[] puede aceptar varios argumentos, por ejemplo una fila y una columna, y puede comprobarlos. IndexError es el error habitual para una posición que no existe:
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
endSalida:
X.
no cell 3,0<< es el operador de anexión. Devolver self permite el encadenamiento, como list << a << b en arreglos:
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 shelfSalida:
Dune | Emma | UlyssesUna asignación mediante []= devuelve el valor asignado, no lo que devuelve el método, como ocurre con cualquier setter. Los corchetes y << proporcionan a una clase una interfaz pequeña y familiar:
inv["apple"] = 5 # llama a []=("apple", 5), la expresión es 5
inv["apple"] # llama a []("apple")
shelf << "Dune" << "Emma" # << devuelve self, así que se encadena
board[1, 2] = "X" # []=(1, 2, "X")Desafío
FácilCompleta la clase Inventory. inv[name] devuelve la cantidad de un artículo (0 cuando se desconoce), inv[name] = qty la establece, y inv << name añade una unidad de ese artículo y devuelve el inventario para que las llamadas se puedan encadenar. to_s devuelve apple: 3, pear: 1 en orden alfabético de los nombres, omitiendo los artículos cuya cantidad sea 0, o empty.
El código proporcionado lee comandos: set apple 5, add apple pear pear (que encadena << para cada nombre), get apple y print, e imprime el resultado de get y print.
Tu código va en inventory.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'inventory'
# Código de entrada/salida suministrado: mantenlo tal como está
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online