Menu
Coddy logo textTech

Birleştirme ve Dönüştürme

Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 36 / 56.

Hash'lerle çalışırken iki işlem o kadar sık karşımıza çıkar ki Ruby onlara kendi metotlarını vermiştir.

merge iki hash'i yeni bir hash'te birleştirir. Her ikisi de aynı anahtara sahip olduğunda, sağ taraftaki değer kazanır:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect   # {color: "red", size: "L"}

Orijinallerin hiçbiri değiştirilmez, merge yeni bir hash döndürür.

transform_values aynı anahtarlara sahip ancak her bir değerin bir bloktan geçirildiği yeni bir hash oluşturur:

prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect   # {apple: 1.2, bread: 3.6}

Ve transform_keys anahtarlar için aynısını yapar; dizeleri sembollere dönüştürürken veya büyük/küçük harf durumunu normalleştirirken kullanışlıdır:

{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}
challenge icon

Görev

Orta

İki adet sepet hash'i verilmiştir: monday ve tuesday; her biri bir dize öğe adını bir tam sayı miktarıyla eşleştirir. Mağaza, normalize edilmiş iki günlük bir toplam istemektedir.

Aşağıdaki adımları izleyerek nihai bir hash oluşturun:

  1. İki hash'i bir blok ile merge ederek, her iki hash'te de bulunan anahtarların miktarlarının (üzerine yazılmak yerine) toplanmasını sağlayın
  2. Sonuç üzerinde transform_keys(&:to_sym) metodunu kullanarak anahtarları sembollere dönüştürün
  3. %10 toplu indirim uygulamak için transform_values metodunu kullanın: her miktar, tam sayı matematiği kullanılarak (qty * 9 / 10) haline gelmelidir

Nihai hash'i inspect ile yazdırın.

Varsayılan veriler için çıktı şöyledir:

{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}

(Elma: 5 + 5 = 10, sonra 9. Ekmek: 3 + 2 = 5, sonra 4. Süt: Sadece Pazartesi 6 → 5. Peynir: Sadece Salı 2 → 1.)

Kopya kağıdı

merge iki hash'i birleştirir; anahtarlar çakıştığında, sağ taraftaki değer kazanır:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
# {color: "red", size: "L"}

Yinelenen anahtarları manuel olarak işlemek için merge metoduna bir blok geçirin:

a.merge(b) { |key, old_val, new_val| old_val + new_val }

transform_values, her bir değerin bir bloktan geçirilmesiyle yeni bir hash döndürür:

prices = { apple: 1, bread: 3 }
prices.transform_values { |p| p * 1.2 }
# {apple: 1.2, bread: 3.6}

transform_keys aynısını anahtarlar için yapar:

{ "a" => 1 }.transform_keys(&:upcase)  # {"A"=>1}
{ "a" => 1 }.transform_keys(&:to_sym)  # {a: 1}

Kendin dene

monday  = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }

# YAPILACAK: çakışan anahtarları toplamak için merge-with-block kullanın, ardından anahtarları sembolize edin,
#           ardından her değere * 9 / 10 uygulayın, ardından inceleyin
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