map ve filter
- Rust kursu
- Orta seviye
- Ders 50/115
- 4 dk
map ve filter adaptörleriyle iterator'ı dönüştürürsün.
map ve filter
map ve filter, yeni bir yineleyici döndüren bağdaştırıcılardır (adapter). Zincirlenerek veri işleme hatları kurulur:
let sonuc: Vec<i32> = (1..=10)
.filter(|n| n % 3 == 0) // 3, 6, 9
.map(|n| n * n) // 9, 36, 81
.collect();map her elemanı dönüştürür, filter koşulu sağlamayanları atar. filter_map ikisini birden yapar: closure Some(x) döndürürse tutar, None döndürürse atar.
Diğer bağdaştırıcılar
Sık kullanılan diğer bağdaştırıcılar:
(1..=5).take(2) // 1, 2
(1..=5).skip(3) // 4, 5
(1..=5).rev() // 5, 4, 3, 2, 1
(1..=5).step_by(2) // 1, 3, 5
(1..=3).chain(7..=8) // 1, 2, 3, 7, 8
(1..=10).take_while(|n| n * n < 20) // 1, 2, 3, 4Bağdaştırıcılar yalnızca yineleyici döndürür; sonucu almak için zincir bir tüketen yöntemle (collect, sum, for) bitmelidir.
Uygulama Üçün katlarının karesi
1..=10 aralığında 3'e bölünenleri filter ile seç, map ile karelerini al ve vektöre toplayıp yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let sonuc: Vec<i32> = (1..=10).filter(|n| n % 3 == 0).map(|n| n * n).collect();
println!("{:?}", sonuc);
}Beklenen çıktı
[9, 36, 81]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>["1", "a", "3"].iter().filter_map(|s| s.parse::<i32>().ok()).sum::<i32>()</code> nedir?
- 0
- 4 Doğru cevap
- Panic
- 13
Açıklama: "a" çevrilemediği için None olur ve atılır; 1 + 3 = 4.
2 Dönüştür
let kareler: Vec<i32> = (1..=3).____(|n| n * n).collect();
let kareler: Vec<i32> = (1..=3).map(|n| n * n).collect();
Açıklama: map her elemanı closure'ın sonucuyla değiştirir.
3 Zincir ve sonucu
| Kavram | Anlamı |
|---|---|
(1..=5).take(2) |
1, 2 |
(1..=5).skip(3) |
4, 5 |
(1..=5).step_by(2) |
1, 3, 5 |
(1..=3).chain(7..=8) |
1, 2, 3, 7, 8 |