İç İçe Hash Yapıları
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 35 / 56.
Bir hash değeri kendi başına bir hash olabilir. Bu iç içe geçmiş yapı, Ruby kodunun yapılandırılmış kayıtları genellikle temsil etme şeklidir; id (veya isim) ile anahtarlanmış, her bir değerin kendi alanlarını taşıdığı tek bir hash:
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}İç içe geçmiş bir değere ulaşmak için aramaları zincirleyin:
puts students["Alice"][:age] # 20
puts students["Bob"][:grade] # Bİçteki hash'lerden birine yeni bir alan eklemek de aynı şekilde çalışır:
students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}Herhangi bir seviyede anahtarı eksik olabilecek iç içe geçmiş bir hash'ten güvenli bir şekilde okuma yapmak için, dig zinciri tarar ve yol boyunca herhangi bir şey eksikse nil döndürür:
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilGörev
Ortaİç içe geçmiş bir inventory hash'i verilmiştir: her üst düzey anahtar bir departman, her iç anahtar bir ürün ve her iç değer stoklanan miktardır (bir tam sayı).
Bir satır girdi okuyun: virgülle ayrılmış department/item arama yollarından oluşan bir liste.
Her bir yol için, sırasıyla, yolu çözümlemek için dig kullanın. Şunlardan birini yazdırın:
- Yol mevcut olduğunda
<department>/<item>: <qty> digmetodunildöndürdüğünde<department>/<item>: missing
Her satırı yazdırdıktan sonra, bir de özet satırı yazdırın:
Total inventory: <sum>Toplam, orijinal hash içindeki her departmandaki her miktarın toplamıdır. İç içe döngü (önce her departman, sonra her ürün) kullanın.
fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk girdisi için çıktı şöyledir:
fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39Kopya kağıdı
İç içe geçmiş hash'ler (nested hashes), değerleri başka bir hash'in içinde hash olarak saklar:
students = {
"Alice" => { age: 20, grade: "A" },
"Bob" => { age: 22, grade: "B" }
}İç içe geçmiş değerlere erişmek için aramaları zincirleyin:
students["Alice"][:age] # 20İç içe geçmiş bir alan eklemek veya güncellemek için atama yapın:
students["Alice"][:major] = "Math"İç içe geçmiş anahtarlar arasında güvenli bir şekilde gezinmek için dig kullanın — herhangi bir anahtar eksikse nil döndürür:
students.dig("Alice", :grade) # "A"
students.dig("Cara", :grade) # nilKendin dene
inventory = {
fruits: { apples: 12, bananas: 4 },
meat: { beef: 7, chicken: 5 },
dairy: { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")
# YAPILACAK: her bir arama için miktarı derinlemesine ara ve yazdır veya 'missing' yazdır.
# Ardından tüm öğeler için 'Total inventory: <toplam>' yazdır.
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ı