Option::copied în Rust

Transformă Option<&T> în Option<T> copiind valoarea; util după get() sau first() pe numere.

Sintaxă
fn copied(self) -> Option<T>  // pentru Option<&T>, unde T: Copy

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() pe Option<&String>: nu compilează, pentru că String nu este Copy. Folosește cloned() 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.