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>pentrui32, pentru că valoarea ar putea să nu încapă. Foloseștetry_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.