Ce face Option::copied
Multe metode returnează o referință în opțiune: vec.get(i), vec.first(), map.get(k) dau Option<&T>. Pentru tipuri mici, care se copiază ieftin (numere, char, bool), e mai comod să ai direct Option<T>.
copied() face exact asta. Pentru tipuri care nu sunt Copy (de exemplu String), folosește cloned(), care apelează clone().
Ce returnează
Some(*x) pentru Some(&x); None pentru None.
Exemple
Exemplul 1: Din referință în valoare
get dă Option<&i32>; după copied() avem Option<i32>, pe care îl putem returna din funcție.
fn temperatura(zi: usize) -> Option<i32> {
let saptamana = [12, 15, 9, 7, 14, 18, 20];
saptamana.get(zi).copied()
}
fn main() {
println!("ziua 0: {:?}", temperatura(0));
println!("ziua 6: {:?}", temperatura(6));
println!("ziua 9: {:?}", temperatura(9));
}
Rezultat
ziua 0: Some(12)
ziua 6: Some(20)
ziua 9: None
Exemplul 2: copied pentru numere, cloned pentru texte
use std::collections::BTreeMap;
fn main() {
let stoc = BTreeMap::from([("mere", 40), ("pere", 0)]);
let bucati: Option<i32> = stoc.get("mere").copied();
println!("mere: {bucati:?}");
let orase = vec![String::from("Iași"), String::from("Cluj")];
let primul: Option<String> = orase.first().cloned();
println!("primul oraș: {primul:?}, vectorul are tot {} orașe", orase.len());
}
Rezultat
mere: Some(40)
primul oraș: Some("Iași"), vectorul are tot 2 orașe
Greșeli frecvente
- Apelezi
copied()peOption<&String>: nu compilează, pentru căStringnu esteCopy. Foloseștecloned()sau păstrează referința.
Comenzi înrudite
Option::as_ref: Transformă &Option<T> în Option<&T> (sau Option<&mut T>), ca să folosești valoarea fără să o muți din opțiune.Option::map: Transformă valoarea din Some cu o funcție și păstrează None neschimbat.Option: Tipul care spune „poate există o valoare, poate nu”: Some(valoare) sau None, în locul lui null din alte limbaje.