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 sayılabilir (enumerable) yapılardır, bu nedenle tıpkı diziler gibi üzerlerinde döngü kurabilirsiniz. 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 yalnızca anahtarları gezer:

prices.each_key { |k| puts k }   # elma, ekmek, süt

each_value yalnızca değerleri gezer:

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'i verilmiştir (öğe sembolü => fiyat tamsayısı).

Tek bir girdi satırı okuyun: %50 indirim uygulanacak öğelerin virgülle ayrılmış bir listesi (hash'teki sembollerle ad olarak eşleşen).

Sırasıyla şunları yazdırın:

  1. Öğe başına <item>: <item>: $<final_price>lt;final_price> biçiminde bir satır; burada nihai fiyat, öğe indirim listesindeyse indirimli değer, aksi takdirde orijinal değerdir. each ile yineleyin. Öğeler orijinal sıralarını korur. İndirim için tamsayı 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ı hâlâ 2 üzerinde olan öğelerin adları, , ile birleştirilmiş olarak (yeni hash üzerinde select + keys kullanın)

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

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

Kendin dene

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

# TODO: each ile final-price hash'ini oluştur; satırları, toplamları, pahalı öğeleri yazdır
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