Pengindeksan dan penambahan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 39 dari 57.
obj[key] memanggil method [], dan obj[key] = value memanggil []=. Dengan mendefinisikannya, sebuah class mendapat sintaks tanda kurung siku seperti array dan hash, dengan makna yang sesuai untuknya:
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"]Output:
7
0[] dapat menerima beberapa argumen, misalnya baris dan kolom, lalu memeriksanya. IndexError adalah error yang biasanya muncul untuk posisi yang tidak ada:
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
endOutput:
X.
no cell 3,0<< adalah operator penambahan. Mengembalikan self darinya memungkinkan perangkaian, seperti list << a << b pada array:
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 shelfOutput:
Dune | Emma | UlyssesPenugasan melalui []= mengembalikan nilai yang ditetapkan, bukan nilai yang dikembalikan method, seperti halnya setter apa pun. Tanda kurung siku dan << memberikan interface yang sederhana dan akrab kepada class:
inv["apple"] = 5 # memanggil []=("apple", 5), nilai ekspresinya adalah 5
inv["apple"] # memanggil []("apple")
shelf << "Dune" << "Emma" # << mengembalikan self, sehingga pemanggilannya bisa dirangkai
board[1, 2] = "X" # []=(1, 2, "X")Tantangan
MudahLengkapi class Inventory. inv[name] mengembalikan jumlah suatu item (0 jika tidak diketahui), inv[name] = qty menetapkan jumlahnya, dan inv << name menambahkan satu item tersebut lalu mengembalikan inventory agar pemanggilan dapat dirangkai. to_s mengembalikan apple: 3, pear: 1 dengan urutan nama secara alfabetis, tanpa menyertakan item dengan jumlah 0, atau empty.
Kode yang disediakan membaca perintah: set apple 5, add apple pear pear (yang merangkai << untuk setiap nama), get apple dan print, lalu mencetak hasil dari get dan print.
Letakkan kodemu di inventory.rb. main.rb berisi kode input/output yang disediakan dan tidak dapat diedit.
Coba sendiri
require_relative 'inventory'
# Kode input/output yang disediakan: biarkan apa adanya
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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online