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)
ouNumeroImpar(u32)
.
- O número é medido em algumas unidades:
- Demonstre como somar um valor
f64
em um valor do tipoNewtons
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.