İ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 çağırır ve obj[key] = value []= metodunu çağırır. Bunları tanımlamak, bir sınıfa dizilerin ve hash'lerin köşeli parantez sözdizimini, kendisine uygun herhangi bir anlamla kazandırır:
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ç bağımsız değişken 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. Bundan 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 setter'da olduğu gibi yöntemin döndürdüğü değeri değil, atanan değeri döndürür. Köşeli parantezler ve <<, bir sınıfa küçük ve tanıdık bir arayüz sağlar:
inv["apple"] = 5 # []=("apple", 5) çağırır, ifade 5'tir
inv["apple"] # []("apple") çağırır
shelf << "Dune" << "Emma" # << self döndürür, bu yüzden zincirlenir
board[1, 2] = "X" # []=(1, 2, "X")Görev
KolayInventory sınıfını tamamla. inv[name] bir öğenin miktarını (bilinmeyen öğeler için 0) döndürür, inv[name] = qty bu miktarı ayarlar ve inv << name o öğeden bir tane ekleyip çağrıların zincirlenebilmesi için envanteri döndürür. to_s, adların alfabetik sırasına göre apple: 3, pear: 1 döndürür; miktarı 0 olan öğeleri dışarıda bırakır veya empty döndürür.
Sağlanan kod şu 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.
Kodun inventory.rb dosyasına yazılmalıdır. main.rb sağlanan giriş/çıkış 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