Łączenie i przekształcanie
Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 36 z 56.
Podczas pracy z hashami tak często używa się dwóch operacji, że Ruby udostępnia dla nich osobne metody.
merge łączy dwa hashe w nowy. Jeśli oba mają ten sam klucz, wygrywa wartość z prawej strony:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Żaden z oryginałów nie jest modyfikowany, merge zwraca nowy hash.
transform_values tworzy nowy hash z tymi samymi kluczami, ale każda wartość jest przekazywana przez blok:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}A transform_keys robi to samo z kluczami; przydaje się podczas konwertowania ciągów znaków na symbole lub normalizowania wielkości liter:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Wyzwanie
ŚredniPodane są dwa hasze koszyka: monday i tuesday, z których każdy mapuje nazwę produktu będącą ciągiem znaków na całkowitą ilość. Sklep chce uzyskać znormalizowaną sumę z dwóch dni.
Utwórz jeden końcowy hasz, wykonując następujące kroki:
- połącz oba hasze za pomocą
mergez blokiem, tak aby ilości kluczy występujących w obu haszach zostały zsumowane (a nie nadpisane) - zastosuj
transform_keys(&:to_sym)do wyniku, aby klucze stały się symbolami - zastosuj
transform_values, aby naliczyć rabat hurtowy w wysokości 10%: każda ilość ma zostać pomnożona przez(qty * 9 / 10)z użyciem arytmetyki całkowitoliczbowej
Wyświetl końcowy hasz za pomocą inspect.
Dla domyślnych danych wynik to:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Jabłka: 5 + 5 = 10, potem 9. Chleb: 3 + 2 = 5, potem 4. Mleko: 6 tylko w poniedziałek → 5. Ser: 2 tylko we wtorek → 1.)
Spróbuj swoich sił
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: scal hashe za pomocą bloku, sumując wartości wspólnych kluczy, a następnie zamień klucze na symbole,
# potem zastosuj * 9 / 10 do każdej wartości, a następnie wyświetl wynik za pomocą inspect
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