Estruturas de Tuplas (Tuple Structs)

Se os nomes dos campos não forem importantes, você pode usar uma estrutura de tupla:

struct Ponto(i32, i32);

fn main() {
    let p = Ponto(17, 23);
    println!("({}, {})", p.0, p.1);
}

Isso é comumente utilizado para wrappers (invólucros) com campo único (chamados newtypes):

struct LibrasDeForca(f64);
struct Newtons(f64);

fn calcular_forca_nas_turbinas() -> LibrasDeForca {
    todo!("Pergunte para um cientista de foguetes da NASA")
}

fn definir_forca_nas_turbinas(force: Newtons) {
    // …
}

fn main() {
    let forca = calcular_forca_nas_turbinas();
    definir_forca_nas_turbinas(forca);
}
  • Newtypes são uma ótima maneira de codificar informações adicionais sobre o valor em um tipo primitivo, por exemplo:
    • O número é medido em algumas unidades: Newtons no exemplo acima.
    • O valor passou por alguma validação quando foi criado, então não é preciso validá-lo novamente a cada uso: NumeroTelefone(String) ou NumeroImpar(u32).
  • Demonstre como somar um valor f64 em um valor do tipo Newtons acessando o campo único no newtype.
    • Geralmente, Rust não gosta de coisas implícitas, como unwrapping automático ou, por exemplo, usar booleanos como inteiros.
    • Sobrecarga de operadores é discutido no Dia 3 (generics).
  • O examplo é uma referência sutil a falha do Orbitador Climático de Marte.