Menu
Coddy logo textTech

İç İç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)   # nil
challenge icon

Gö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>
  • dig metodu nil dö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: 39

Kopya 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)   # nil

Kendin 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.
quiz iconKendini test et

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