Özel Koleksiyonlar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 40 / 57.
Bir koleksiyon sınıfı birkaç özel yöntemi bir araya getirir: Enumerable ile each, ekleme için <<, size ve yazdırma için to_s ile inspect. Dizilerde olduğu gibi, each bir blok olmadan da çalışmalı ve to_enum ile bir numaralandırıcı döndürmelidir:
class TodoList
include Enumerable
def initialize
@items = []
end
def <<(item)
@items << item
self
end
def each
return to_enum(:each) unless block_given?
@items.each { |item| yield item }
self
end
end
list = TodoList.new << "wash" << "shop" << "cook"
list.each.with_index(1) { |item, n| puts "#{n}. #{item}" }
p list.select { |i| i.include?("o") }Çıktı:
1. wash
2. shop
3. cook
["shop", "cook"]block_given?, çağıranın bir blok iletip iletmediğini belirtir. Blok olmadan döndürülen enumerator, each.with_index, each_slice veya next gibi zincirleme kullanımları destekler:
class Countdown
include Enumerable
def initialize(from)
@from = from
end
def each
return to_enum(:each) unless block_given?
@from.downto(1) { |n| yield n }
end
end
e = Countdown.new(3).each
puts e.next
puts e.next
p Countdown.new(5).each_slice(2).to_aÇıktı:
3
2
[[5, 4], [3, 2], [1]]to_s kullanıcılar için anlaşılır metindir, inspect ise programcılar için kısa bir özettir. Bir koleksiyon için inspect genellikle her öğe yerine sınıfı ve boyutu gösterir:
class TodoList
include Enumerable
def initialize(*items)
@items = items
end
def each(&block)
@items.each(&block)
end
def size
@items.size
end
def to_s
map.with_index(1) { |item, n| "#{n}. #{item}" }.join("\n")
end
def inspect
"#<TodoList #{size} items>"
end
end
list = TodoList.new("wash", "shop")
puts list
p listÇıktı:
1. wash
2. shop
#<TodoList 2 items>Enumerable count sağlar, ancak size, empty?, << veya [] sağlamaz: bunlar sınıfa aittir, çünkü öğelerin nasıl depolandığını yalnızca sınıf bilir. Bunları tanımlamak, koleksiyonun çağıranlarına bir dizi gibi hissettirmesini sağlar:
def size
@items.size
end
def empty?
@items.empty?
end
def [](index)
@items[index]
endGörev
KolayTodoList sınıfını tamamla. << bir görev metni ekler ve listeyi döndürür. each görevleri yield eder ve blok olmadan to_enum(:each) döndürür. Enumerable modülünü dahil et. size görevlerin sayısını döndürür. to_s görevleri numaralandırılmış satırlar olarak, 1. wash veya nothing to do şeklinde döndürür; inspect ise #<TodoList 3 items> döndürür.
Sağlanan kod, her giriş satırını << zincirleyerek ekler; ardından listeyi, listenin p çıktısını, each.with_index(1) ile ! kullanılarak numaralandırılmış görevleri (örneğin 1! wash), o içeren görevlerin sayısını ve alfabetik olarak ilk görevi yazdırır.
Kodun todo_list.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'todo_list'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
list = input.reduce(TodoList.new) { |l, task| l << task }
puts list
p list
list.each.with_index(1) { |task, n| puts "#{n}! #{task}" }
puts "with o: #{list.count { |t| t.include?("o") }}"
puts "first: #{list.min}"
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