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] # BDodawanie 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) # nilWyzwanie
ŚredniDany 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, gdydigzwracanil
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: 39Spró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.
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
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocenPoćwicz samodzielnie: Kompilator Ruby online