Reduce / Inject
Coddy'nin Ruby Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 23 / 56.
Bazen bir dizinin tamamını tek bir değere, bir toplama, bir çarpıma veya en uzun dizeye indirgemeniz gerekir. reduce (aynı zamanda inject olarak da adlandırılır: aynı metod, iki isim) bu iş için kullanılan araçtır.
Blok iki parametre alır: biriktirici (accumulator) ve geçerli öğe. Bloğun dönüş değeri bir sonraki biriktirici olur.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Adım adım biriktirici şöyledir: 0 → 1 → 3 → 6 → 10.
İlk argüman, biriktiricinin (accumulator) başlangıç değeridir. Eğer bunu belirtmezseniz, Ruby dizinin ilk elemanını kullanır:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Toplam ve çarpım gibi saf işlemler için Ruby size bir kısayol sunar; bir blok yerine bir sembol geçirin:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Özel bir biriktirici (accumulator) oluşturabildiğinizde, neredeyse her şeyi tek bir geçişte hesaplayabilirsiniz.
Görev
KolayVirgülle ayrılmış bir tam sayı listesi okuyun. Üç satır yazdırın:
- Toplam (
reduce(:+)kullanın) - Çarpım (
reduce(:*)kullanın) reduceve açık bir blok ile hesaplanan maksimum değer,maxkullanılmamalıdır.
2,5,3,8 girdisi için çıktı şöyledir:
18
240
8Kopya kağıdı
reduce (takma ad: inject), bir diziyi tek bir değere indirger. Blok, bir biriktirici (accumulator) ve mevcut öğeyi alır; dönen değer bir sonraki biriktirici olur.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n } # 10İlk öğeyi başlangıç biriktiricisi olarak kullanmak için başlangıç değerini belirtmeyebilirsiniz:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Basit işlemler için kısayol olarak bir sembol (symbol) geçirin:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Kendin dene
numbers = gets.chomp.split(",").map(&:to_i)
# YAPILACAK: toplamı, çarpımı ve maksimumu yazdır (reduce + açık blok ile)
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ı