Vec::starts_with în Rust

Verifică dacă vectorul începe cu elementele date (în aceeași ordine); ends_with verifică sfârșitul.

Sintaxă
pub fn starts_with(&self, needle: &[T]) -> bool   // T: PartialEq
pub fn ends_with(&self, needle: &[T]) -> bool

Ce face Vec::starts_with

starts_with(&[a, b]) returnează true dacă primele elemente ale vectorului sunt exact a, apoi b. Perechea ei, ends_with, verifică ultimele elemente. Un slice gol este prefixul (și sufixul) oricărui vector.

Sunt utile pentru date binare (semnătura de la începutul unui fișier), pentru rute și căi împărțite în bucăți sau pentru comenzi formate din mai multe cuvinte.

Parametri

Parametru Descriere
needle Slice-ul căutat la început (sau la sfârșit).

Ce returnează

true sau false.

Exemple

Exemplul 1: Traseul trenului

fn main() {
    let traseu = vec!["București", "Ploiești", "Brașov", "Sibiu"];
    println!("{}", traseu.starts_with(&["București", "Ploiești"]));
    println!("{}", traseu.starts_with(&["Brașov"]));
    println!("{}", traseu.ends_with(&["Brașov", "Sibiu"]));
    println!("{}", traseu.starts_with(&[]));
}

Rezultat

true
false
true
true

Exemplul 2: Tipul unui fișier după primii octeți

Formatele de fișiere încep cu o „semnătură” fixă. b"%PDF" este un șir de octeți. {:02X?} afișează octeții în hexazecimal.

fn tip_fisier(octeti: &[u8]) -> &'static str {
    if octeti.starts_with(&[0x89, b'P', b'N', b'G']) {
        "imagine PNG"
    } else if octeti.starts_with(b"%PDF") {
        "document PDF"
    } else if octeti.starts_with(&[0xFF, 0xD8, 0xFF]) {
        "imagine JPEG"
    } else {
        "necunoscut"
    }
}

fn main() {
    let fisiere = vec![
        vec![0x89, b'P', b'N', b'G', 0x0D, 0x0A],
        b"%PDF-1.7".to_vec(),
        vec![0xFF, 0xD8, 0xFF, 0xE0],
        vec![1, 2, 3],
    ];
    for f in &fisiere {
        println!("{:02X?} -> {}", &f[..3], tip_fisier(f));
    }
}

Rezultat

[89, 50, 4E] -> imagine PNG
[25, 50, 44] -> document PDF
[FF, D8, FF] -> imagine JPEG
[01, 02, 03] -> necunoscut

Greșeli frecvente

  • Dai un singur element în loc de slice: v.starts_with("București") nu compilează. Scrie v.starts_with(&["București"]) sau compară v.first() == Some(&"București").
  • Confunzi cu str::starts_with pentru text: aceea verifică un prefix de caractere, aceasta un prefix de elemente.

Comenzi înrudite

  • Vec::contains: Verifică dacă vectorul conține un element egal cu valoarea dată; parcurge elementele unul câte unul.
  • Vec::first: first returnează primul element, last ultimul, ca Option: None dacă vectorul este gol.
  • Vec::split_at: Împarte vectorul în două slice-uri la o poziție, fără copiere: elementele dinainte și elementele de la poziție încolo.
  • Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.