Menu
Coddy logo textTech

Zagnieżdżone hasze

Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 35 z 56.

Wartością hasza może być sam hasz. Taka zagnieżdżona struktura jest typowym sposobem, w jaki kod Ruby reprezentuje ustrukturyzowane rekordy: pojedynczy hasz z kluczami będącymi identyfikatorami (lub nazwami), w którym każda wartość zawiera własne pola:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Aby dotrzeć do zagnieżdżonej wartości, wykonuj kolejne wyszukiwania:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

Dodawanie nowego pola do jednego z wewnętrznych hashy działa tak samo:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

Aby bezpiecznie odczytać wartość z zagnieżdżonego hasza, w którym na dowolnym poziomie może brakować klucza, dig przechodzi przez kolejne poziomy i zwraca nil, jeśli któregoś brakuje:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

Wyzwanie

Średni

Dany jest zagnieżdżony hash inventory: każdy klucz najwyższego poziomu oznacza dział, każdy klucz wewnętrzny — produkt, a każda wartość wewnętrzna — ilość zapasów (liczbę całkowitą).

Wczytaj jeden wiersz danych wejściowych: listę ścieżek wyszukiwania department/item rozdzielonych przecinkami.

Dla każdej ścieżki, po kolei, użyj dig, aby ją rozwiązać. Wypisz:

  • <department>/<item>: <qty>, gdy ścieżka istnieje
  • <department>/<item>: missing, gdy dig zwraca nil

Po wypisaniu każdego wiersza wypisz również jeden wiersz podsumowania:

Total inventory: <sum>

Suma to suma każdej ilości ze wszystkich działów w oryginalnym hashu. Użyj zagnieżdżonej iteracji (każdy dział, a następnie każdy produkt).

Dla danych wejściowych fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk wynik to:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

Spróbuj swoich sił

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: dla każdego wyszukiwania użyj dig i wypisz qty lub 'missing'.
#       Następnie wypisz 'Total inventory: <sum>' dla wszystkich elementów.
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator Ruby online