Into în Rust

Perechea lui From văzută din partea sursei: x.into() convertește în tipul cerut; util în parametri generici.

Sintaxă
let t: Tinta = sursa.into();

fn f(nume: impl Into<String>) {
    let nume: String = nume.into();
}

Ce face Into

a.into() transformă a în tipul așteptat în acel loc. Rust trebuie să știe tipul țintă: din tipul variabilei (let s: String = "Iași".into();), din parametrul funcției sau din tipul returnat. Funcționează pentru orice pereche pentru care există From.

Un folos practic este în parametri: fn new(nume: impl Into<String>) acceptă și "Ana", și un String, fără ca apelantul să scrie .to_string(). Nu implementa Into direct: implementează From, iar Into apare automat.

Ce returnează

into() returnează valoarea convertită; sursa este consumată.

Exemple

Exemplul 1: Tipul țintă vine din context

fn main() {
    let s: String = "Constanța".into();
    let mare: i64 = 42_i32.into();
    let zecimal: f64 = 3_u8.into();
    let v: Vec<char> = ['a', 'ș'].into();
    let o: Option<u32> = 5.into();
    println!("{s} {mare} {zecimal} {v:?} {o:?}");
}

Rezultat

Constanța 42 3 ['a', 'ș'] Some(5)

Exemplul 2: Parametri care acceptă &str și String

struct Utilizator {
    nume: String,
    oras: String,
}

impl Utilizator {
    fn new(nume: impl Into<String>, oras: impl Into<String>) -> Self {
        Utilizator { nume: nume.into(), oras: oras.into() }
    }
}

fn main() {
    let oras = String::from("Sibiu");
    let a = Utilizator::new("Ana", oras);           // &str și String
    let b = Utilizator::new(String::from("Radu"), "Brașov");
    println!("{} din {}", a.nume, a.oras);
    println!("{} din {}", b.nume, b.oras);
}

Rezultat

Ana din Sibiu
Radu din Brașov

Greșeli frecvente

  • Scrii let x = a.into(); fără tip: type annotations needed. Rust nu poate ghici în ce să convertească.
  • Încerci let n: i32 = 5_i64.into();: nu există From<i64> pentru i32, pentru că valoarea ar putea să nu încapă. Folosește try_into().

Comenzi înrudite

  • From: Trait-ul pentru conversii care nu pot eșua: Tinta::from(x). Implementându-l, primești gratuit și x.into().
  • TryFrom: Conversii care pot eșua și returnează Result: u8::try_from(300) dă Err. Implementarea aduce și try_into().
  • AsRef: Conversie ieftină de la referință la referință; folosit în funcții generice care acceptă String, &str, PathBuf etc.