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}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:
- İki hash'i bir blok ile
mergeederek, her iki hash'te de bulunan anahtarların miktarlarının (üzerine yazılmak yerine) toplanmasını sağlayın - Sonuç üzerinde
transform_keys(&:to_sym)metodunu kullanarak anahtarları sembollere dönüştürün - %10 toplu indirim uygulamak için
transform_valuesmetodunu 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
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
1Derinlemesine Stringler
String Metotlarına Genel BakışString InterpolationStringler Üzerinde GezinmeSplit ve JoinÖzet - String Weaver4Bloklar, Procs ve Lambdalar
Blok Nedir?do..end ve Süslü Parantezleryield Anahtar KelimesiBlok ParametreleriProcs ve LambdalarÖzet - Özel İteratör7Hashes Bölüm 2
Varsayılan Değerlerle Hash.newHash Yapıları Üzerinde Yinelemeİç İçe Hash YapılarıBirleştirme ve DönüştürmeÖzet - Frekans Sayacı10Proje - Öğrenci Kayıtları
Projeye Genel BakışÖğrenci Ekle5Enumerable Gücü
Select ve RejectMap ZincirlemeReduce / Injectcount, all?, any?, none?group_by ve partitionsort_by, min_by, max_byÖzet - Data Pipeline8İleri Seviye Karar Yapıları
Sınıflar ve Regex ile CaseÇok Değerli whenTernary OperatörüSatır İçi if / unlessÖzet - Not Sınıflandırıcı