İndeksleme ve Ekleme
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 39 / 57.
obj[key], [] metodunu; obj[key] = value ise []= metodunu çağırır. Bunları tanımlamak, bir sınıfa dizilerin ve hash'lerin köşeli parantez söz dizimini kazandırır; sınıfa uygun olan her türlü anlamı verebilirsiniz:
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"]Çıktı:
7
0[] birkaç argüman alabilir; örneğin bir satır ve bir sütun, ayrıca bunları denetleyebilir. Var olmayan bir konum için genellikle IndexError hatası kullanılır:
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
endÇıktı:
X.
no cell 3,0<< ekleme operatörüdür. Bu operatörden self döndürmek, dizilerdeki list << a << b gibi zincirleme kullanıma olanak tanır:
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 shelfÇıktı:
Dune | Emma | Ulysses[]= aracılığıyla yapılan bir atama, herhangi bir ayarlayıcıda olduğu gibi yöntemin döndürdüğü değeri değil, atanan değeri döndürür. Köşeli ayraçlar ve <<, bir sınıfa küçük ve tanıdık bir arayüz kazandırır:
inv["apple"] = 5 # []=("apple", 5) çağrılır, ifadenin değeri 5'tir
inv["apple"] # []("apple") çağrılır
shelf << "Dune" << "Emma" # << self döndürür, böylece zincirleme kullanılabilir
board[1, 2] = "X" # []=(1, 2, "X")Görev
KolayInventory sınıfını tamamla. inv[name] bir öğenin miktarını döndürür (bilinmiyorsa 0), inv[name] = qty miktarı ayarlar ve inv << name o öğeden bir tane ekleyip envanteri döndürür; böylece çağrılar zincirlenebilir. to_s, adların alfabetik sırasına göre apple: 3, pear: 1 değerini döndürür; miktarı 0 olan öğeleri listeye almaz. Hiç öğe yoksa empty döndürür.
Verilen kod komutları okur: set apple 5, add apple pear pear (her ad için << işlemini zincirler), get apple ve print; ayrıca get ve print sonuçlarını yazdırır.
Kodunu inventory.rb dosyasına yaz. main.rb verilen girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'inventory'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi