Menu
Coddy logo textTech

Hash'ler Üzerinde Yineleme

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

Hash'ler numaralandırılabilir olduğundan, tıpkı diziler gibi bunlar üzerinde yineleme yapabilirsiniz. Ne yapmak istediğinize bağlı olarak üç yaygın kalıp vardır.

each sana 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 üzerinde dolaşır:

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

each_value yalnızca değerler üzerinde gezinir:

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

Geçen bölümde gördüğün her Enumerable yöntemi, map, select, reduce: hash'ler üzerinde de çalışır. Her yinelemede yalnızca bir anahtar/değer çifti (veya 2 öğeli bir dizi) alırsın:

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

Görev

Orta

Bir fiyat listesine indirim uyguluyorsun. prices hash'i veriliyor (ürün sembolü => fiyat tamsayısı).

Bir satır girdi oku: hash'teki sembollerle ada göre eşleşen, %50 indirim uygulanacak ürünlerin virgülle ayrılmış listesi.

Şu sırayla yazdır:

  1. <item>: $<final_price> biçiminde her ürün için bir satır; burada son fiyat, ürün indirim listesinde yer alıyorsa indirimli değer, aksi hâlde orijinal değerdir. each ile yinele. Ürünler özgün sıralarını korur. İndirim için tamsayı bölmesi kullan (price / 2).
  2. Was: $<n>: orijinal toplam (values.sum kullan)
  3. Now: $<n>: indirim sonrası toplam
  4. Son fiyatı hâlâ 2 değerinden büyük olan ürünlerin adları; , ile birleştirilmiş olarak (yeni hash üzerinde select + keys kullan)

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

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

Kendi başına pratik yap: Online Ruby derleyicisi