Varsayılan Değerlerle Hash.new
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 33 / 56.
Varsayılan olarak, bir hash içinde eksik bir anahtarı aramak nil döndürür:
scores = {}
puts scores["Alice"] # nilHash.new(default) bunu değiştirir. Eksik olan her anahtar, girdiğiniz değeri döndürür:
scores = Hash.new(0)
puts scores["Alice"] # 0Bir sayaç yazmanın en temiz yolu budur. Artırmadan önce if scores[name].nil? kontrolü yapmanıza gerek yoktur:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}Önemli: Hash.new(0) varsayılanı 0 olarak ayarlar ancak okuduğunuzda anahtarı saklamaz. Siz atama yapana kadar hash boş kalır. Bu nedenle, counts[letter] += 1 yazdığınızda, anahtar yeni değerle birlikte eklenir.
Görev
KolayVirgülle ayrılmış category:amount girişlerinden oluşan bir listeyi okuyun (örneğin food:12,gas:30,food:8,books:25,gas:15). Hash.new(0) kullanarak kategori başına toplamların bir hash'ini oluşturun, ardından toplamı en az 20 olan kategorileri, toplama göre azalan düzende sıralanmış olarak her satıra bir tane gelecek şekilde yazdırın:
<category>: <total>Yukarıdaki örnek girdi için çıktı şöyledir:
gas: 45
books: 25
food: 20Eğer hiçbir kategori 20 değerine ulaşmazsa, hiçbir şey yazdırmayın.
Kopya kağıdı
Varsayılan olarak, eksik hash anahtarları nil döndürür. Bunun yerine farklı bir varsayılan değer döndürmek için Hash.new(default) kullanın:
scores = Hash.new(0)
puts scores["Alice"] # 0Bu, sayaçları temiz hale getirir — artırmadan önce nil kontrolü yapmaya gerek kalmaz:
counts = Hash.new(0)
["a", "b", "a"].each do |letter|
counts[letter] += 1
end
# {"a"=>2, "b"=>1}Not: eksik bir anahtarı okumak onu kaydetmez. Anahtar yalnızca bir değer atadığınızda (örneğin +=) eklenir.
Kendin dene
entries = gets.chomp.split(",")
# YAPILACAKLAR: totals = Hash.new(0); kategori başına tutarı biriktir;
# ardından toplamı >= 20 olan kategorileri, toplama göre azalan şekilde yazdır
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ı