Menu
Coddy logo textTech

Łą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}
challenge icon

Wyzwanie

Średni

Podane 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:

  1. połącz oba hasze za pomocą merge z blokiem, tak aby ilości kluczy występujących w obu haszach zostały zsumowane (a nie nadpisane)
  2. zastosuj transform_keys(&:to_sym) do wyniku, aby klucze stały się symbolami
  3. 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
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