Option

Já vimos algum uso de Option<T>. Ele armazena um valor do tipo T ou nada. Por exemplo, String::find retorna um Option<usize>.

fn main() {
    let name = "Löwe 老虎 Léopard Gepardi";
    let mut position: Option<usize> = name.find('é');
    println!("find retornou {position:?}");
    assert_eq!(position.unwrap(), 14);
    position = name.find('Z');
    println!("find retornou {position:?}");
    assert_eq!(position.expect("Caractere não encontrado"), 0);
}
This slide should take about 10 minutes.
  • Option é amplamente utilizado, não apenas na biblioteca padrão.
  • unwrap retornará o valor em um Option, ou entrará em pânico. expect é semelhante, mas recebe uma mensagem de erro.
    • Você pode entrar em pânico em None, mas não pode “acidentalmente” esquecer de verificar None.
    • É comum unwrap/expect em todos os lugares ao hackear algo, mas o código de produção normalmente lida com None de uma maneira mais elegante.
  • A otimização de nicho significa que Option<T> muitas vezes tem o mesmo tamanho na memória que T.