Menu
Coddy logo textTech

Hash Yapıları Üzerinde Yineleme

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

Hash'ler enumerable'dır, bu nedenle onları tıpkı diziler gibi yineleyebilirsiniz. Ne istediğinize bağlı olarak üç yaygın desen vardır.

each size hem anahtarı hem de değeri verir:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key sadece anahtarlar üzerinde gezinir:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value yalnızca değerleri dolaşır:

prices.each_value { |v| puts v }   # 1, 3, 4

Ve geçen bölümde gördüğünüz her Enumerable metodu, map, select, reduce: hash'ler üzerinde de çalışır. Her yinelemede sadece bir anahtar/değer çifti (veya 2 elemanlı bir dizi) alırsınız:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

Görev

Orta

Bir fiyat listesine indirim uyguluyorsunuz. prices hash yapısı verilmiştir (öğe sembolü => fiyat tam sayısı).

Bir satırlık girdi okuyun: %50 indirim yapılacak öğelerin virgülle ayrılmış bir listesi (hash içindeki sembollerle isim bazında eşleşen).

Şu sırayla yazdırın:

  1. Her öğe için <item>: <item>: $<final_price>lt;final_price> formatında bir satır; burada nihai fiyat, öğe indirim listesindeyse indirimli değer, aksi takdirde orijinal değerdir. each ile yineleme yapın. Öğeler orijinal sıralarını korur. İndirim için tam sayı bölmesi kullanın (price / 2).
  2. Was: Was: $<n>lt;n>: orijinal toplam (values.sum kullanın)
  3. Now: Now: $<n>lt;n>: indirim sonrası toplam
  4. Nihai fiyatı hala 2 değerinin üzerinde olan öğelerin adlarını , ile birleştirerek yazdırın (yeni hash üzerinde select + keys kullanın)

Varsayılan hash ile bread,milk girdisi için çıktı şöyledir:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Kopya kağıdı

each, each_key, each_value ile hash'ler üzerinde yineleme yapmak:

prices = { apple: 1, bread: 3, milk: 4 }

prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }

map, select ve reduce gibi Enumerable metotları, her yinelemede bir anahtar/değer çifti alarak hash'ler üzerinde de çalışır:

prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }

Faydalı hash metotları: tüm değerleri toplamak için .values.sum, anahtarlardan oluşan bir dizi almak için .keys.

Kendin dene

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# YAPILACAK: each kullanarak final-price hash'ini oluşturun; satırları, toplamları ve pahalı öğeleri yazdırın
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