Hash Yapıları Üzerinde Yineleme
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 34 / 56.
Hash'ler enumerable'dır, bu nedenle onları tıpkı diziler gibi yineleyebilirsiniz. Ne istediğinize bağlı olarak üç yaygın desen vardır.
each size hem anahtarı hem de değeri verir:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key sadece anahtarlar üzerinde gezinir:
prices.each_key { |k| puts k } # apple, bread, milkeach_value yalnızca değerleri dolaşır:
prices.each_value { |v| puts v } # 1, 3, 4Ve geçen bölümde gördüğünüz her Enumerable metodu, map, select, reduce: hash'ler üzerinde de çalışır. Her yinelemede sadece bir anahtar/değer çifti (veya 2 elemanlı bir dizi) alırsınız:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Görev
OrtaBir fiyat listesine indirim uyguluyorsunuz. prices hash yapısı verilmiştir (öğe sembolü => fiyat tam sayısı).
Bir satırlık girdi okuyun: %50 indirim yapılacak öğelerin virgülle ayrılmış bir listesi (hash içindeki sembollerle isim bazında eşleşen).
Şu sırayla yazdırın:
- Her öğe için
<item>: <item>: $<final_price>lt;final_price>formatında bir satır; burada nihai fiyat, öğe indirim listesindeyse indirimli değer, aksi takdirde orijinal değerdir.eachile yineleme yapın. Öğeler orijinal sıralarını korur. İndirim için tam sayı bölmesi kullanın (price / 2). Was: Was: $<n>lt;n>: orijinal toplam (values.sumkullanın)Now: Now: $<n>lt;n>: indirim sonrası toplam- Nihai fiyatı hala
2değerinin üzerinde olan öğelerin adlarını,ile birleştirerek yazdırın (yeni hash üzerindeselect+keyskullanın)
Varsayılan hash ile bread,milk girdisi için çıktı şöyledir:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseKopya kağıdı
each, each_key, each_value ile hash'ler üzerinde yineleme yapmak:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }map, select ve reduce gibi Enumerable metotları, her yinelemede bir anahtar/değer çifti alarak hash'ler üzerinde de çalışır:
prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }Faydalı hash metotları: tüm değerleri toplamak için .values.sum, anahtarlardan oluşan bir dizi almak için .keys.
Kendin dene
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# YAPILACAK: each kullanarak final-price hash'ini oluşturun; satırları, toplamları ve pahalı öğeleri yazdırın
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı