CodeBlanks Logo Icon CodeBlanks

collect

collect ile iterator'u koleksiyona çevirirsin.

collect

collect, yineleyiciyi FromIterator uygulayan herhangi bir koleksiyona dönüştürür. Hedef tür, değişken türünden ya da turbofish'ten anlaşılır:

let v: Vec<char> = "abc".chars().collect();
let s: String = vec!['x', 'y'].into_iter().collect();
let k: std::collections::HashSet<i32> = [1, 1, 2].into_iter().collect();

Aynı zincir, yalnızca hedef tür değiştirilerek farklı koleksiyonlar üretebilir.

Hatalı toplama

Tüm metinleri sayıya çevirmek ve biri bile hatalıysa vazgeçmek için:

let iyi: Result<Vec<i32>, _> = ["4", "5"].iter().map(|s| s.parse::<i32>()).collect();
let kotu: Result<Vec<i32>, _> = ["1", "x"].iter().map(|s| s.parse::<i32>()).collect();
println!("{:?} {}", iyi, kotu.is_err());   // Ok([4, 5]) true

unzip ise ikililerden oluşan bir yineleyiciyi iki koleksiyona ayırır: let (a, b): (Vec<_>, Vec<_>) = [(1, 'a'), (2, 'b')].into_iter().unzip();

Uygulama Doğrulayarak topla

["1", "2", "x"] ve ["4", "5"] dizilerini parse::<i32>() ile Result<Vec<i32>, _>'ye topla. Birincinin is_err() sonucunu ve ikinciyi {:?} ile boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn main() {
    let r1: Result<Vec<i32>, _> = ["1", "2", "x"].iter().map(|s| s.parse::<i32>()).collect();
    let r2: Result<Vec<i32>, _> = ["4", "5"].iter().map(|s| s.parse::<i32>()).collect();
    println!("{} {:?}", r1.is_err(), r2);
}

Beklenen çıktı

true Ok([4, 5])

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>Result</code> öğelerinden oluşan bir yineleyici <code>Result&lt;Vec&lt;T&gt;, E&gt;</code>'ye toplanırsa ne olur?

  • Hepsi Ok ise Ok(vektör), ilk Err'de durup o hatayı döndürür Doğru cevap
  • Err'ler atlanır
  • Panic verir
  • Derlenmez

Açıklama: Bu, girdilerin tamamını doğrulayıp tek bir hata ile dönmenin en kısa yoludur. Option için de aynısı geçerlidir.

2 Metne topla

Soru
let s: ____ = vec!['x', 'y'].into_iter().collect();
Cevap
let s: String = vec!['x', 'y'].into_iter().collect();

Açıklama: char yineleyicisi String'e toplanabilir.

3 Hedef tür ve sonuç

Kavram Anlamı
Vec<char> ← "ab".chars() ['a', 'b']
String ← ['x', 'y'] "xy"
HashSet ← [1, 1, 2] 2 eleman
Result<Vec<i32>, _> ← ["1", "x"] Err

Orta seviye bölümündeki tüm dersler