Tipos Compostos

TiposLiterais
Matrizes[T; N][20, 30, 40], [0; 3]
Tuplas(), (T,), (T1, T2), …(), ('x',), ('x', 1.2), …

Atribuição e acesso a matrizes:

fn main() {
    let mut a: [i8; 10] = [42; 10];
    a[5] = 0;
    println!("a: {:?}", a);
}

Atribuição e acesso a tuplas:

fn main() {
    let t: (i8, bool) = (7, true);
    println!("1º índice: {}", t.0);
    println!("2º índice: {}", t.1);
}

Pontos chave:

Vetores:

  • O valor do tipo matriz [T; N] comporta N elementos (constante em tempo de compilação) do mesmo tipo N. Note que o tamanho de uma matriz é parte do seu tipo, o que significa que [u8; 3] e [u8; 4] são considerados dois tipos diferentes.

  • Nós podemos usar literais para atribuir valores para matrizes.

  • Na função main, o comando print pede a implementação de depuração (debug) com o parâmetro de formato formato ?: {} produz a saída padrão, {:?} produz a saída de depuração. Nós também poderíamos ter usado {a} e {a:?} sem especificar o valor depois da string de formato.

  • Adicionando #, p.ex. {a:#?}, invoca um formato “pretty printing” (“impressão bonita”), que pode ser mais legível.

Tuplas:

  • Assim como matrizes, tuplas têm tamanho fixo.

  • Tuplas agrupam valores de diferentes tipos em um tipo composto.

  • Campos de uma tupla podem ser acessados com um ponto e o índice do valor, e.g. t.0, t.1.

  • A tupla vazia () também é conhecida como “tipo unidade” (unit type). É tanto um tipo quanto o único valor válido desse tipo - ou seja, o tipo e seu valor são expressos como (). É usado para indicar, por exemplo, que uma função ou expressão não tem valor de retorno, como veremos em um slide futuro.

    • Você pode pensar nisso como um void, que talvez lhe seja familiar de outras linguagens de programação.