Enumerable Modülü
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 57.
Enumerable, dizilerin ve hash'lerin koleksiyon yöntemlerinin arkasındaki modüldür. each tanımlayan, öğelerini teker teker yield eden ve Enumerable içeren bir sınıf; map, select, count, sort_by, min_by, sum, include? ve düzinelerce başka yöntemi elde eder:
class Playlist
include Enumerable
def initialize(*songs)
@songs = songs
end
def each
@songs.each { |song| yield song }
end
end
list = Playlist.new("Intro", "Dune", "Outro")
puts list.map(&:upcase).join(", ")
puts list.select { |s| s.size > 4 }.inspect
puts list.count
puts list.include?("Dune")Çıktı:
INTRO, DUNE, OUTRO
["Intro", "Outro"]
3
trueyield, çağıranın each'e verdiği bloğa bir değer aktarır. Sınıf, bir öğenin ne olduğunu belirler; bu, örneğin bir metin satırı, bir değer çifti veya kendi nesnelerinden biri olabilir:
class Inventory
include Enumerable
def initialize
@stock = { "apple" => 3, "pear" => 0, "plum" => 7 }
end
def each
@stock.each { |name, qty| yield name, qty }
end
end
inv = Inventory.new
p inv.select { |_, qty| qty.positive? }.map(&:first)
p inv.max_by { |_, qty| qty }Çıktı:
["apple", "plum"]
["plum", 7]Öğelerin depolanması gerekmez. each, öğeleri ilerledikçe hesaplayabilir ve first gibi yöntemler döngüyü erkenden durdurur:
class Squares
include Enumerable
def initialize(limit)
@limit = limit
end
def each
n = 1
while n * n <= @limit
yield n * n
n += 1
end
end
end
p Squares.new(50).to_a
p Squares.new(1000).first(3)
puts Squares.new(100).sumÇıktı:
[1, 4, 9, 16, 25, 36, 49]
[1, 4, 9]
385Öğeler <=> tanımladığında, Enumerable öğesinin sort, min ve max gibi sıralama yöntemleri bir blok olmadan çalışır. Aksi takdirde, sort_by ve min_by yöntemlerinde olduğu gibi bir blok alırlar:
class Team
include Enumerable
def each(&block)
@players.each(&block) # bloğu doğrudan ilet
end
end
team.sort_by(&:age)
team.min_by(&:score)Görev
KolayPlaylist sınıfını tamamla. Sınıf, add ile eklenen Song nesnelerini (title ve seconds ile birlikte) tutar, Enumerable modülünü içerir ve eklenme sırasına göre her şarkıyı veren each metodunu tanımlar.
Sağlanan kod, her girdi satırı için bir şarkı ekler (title,seconds) ve ardından çalma listesinde yalnızca Enumerable metotlarını kullanır: şarkı sayısını, virgüllerle birleştirilmiş başlıkları, toplam süreyi m:ss biçiminde, en uzun başlığı ve 3 dakikadan uzun şarkıların alfabetik olarak sıralanmış başlıklarını (veya none) yazdırır.
Kodun song.rb ve playlist.rb dosyalarına yazılmalıdır. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'song'
require_relative 'playlist'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
list = Playlist.new
input.each do |line|
title, seconds = line.split(",")
list.add(Song.new(title, seconds.to_i))
end
total = list.sum(&:seconds)
long = list.select { |s| s.seconds > 180 }.map(&:title).sort
puts "songs: #{list.count}"
puts "titles: #{list.map(&:title).join(", ")}"
puts format("total: %d:%02d", total / 60, total % 60)
puts "longest: #{list.max_by(&:seconds).title}"
puts "over 3 min: #{long.empty? ? "none" : long.join(", ")}"
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ı6Modüller ve Mixin'ler
Modüller ve includeNesneleri GenişletmeComparable ModülüEnumerable ModülüTekrar - Spor LigiKendi başına pratik yap: Online Ruby derleyicisi