Tuplas e Matrizes

Tuplas e matrizes sĂŁo os primeiros tipos “compostos” que vimos. Todos os elementos de uma matriz tĂȘm o mesmo tipo, enquanto as tuplas podem acomodar diferentes tipos. Ambos os tipos tĂȘm um tamanho fixo em tempo de compilação.

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!("t.0: {}", t.0);
    println!("t.1: {}", t.1);
}
This slide should take about 10 minutes.

Pontos chave:

Matrizes:

  • 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. Slices (fatias), que tĂȘm um tamanho determinado em tempo de execução, sĂŁo abordados mais tarde.

  • Tente acessar um elemento de matriz fora dos limites. Os acessos a matrizes sĂŁo verificados em tempo de execução. Rust geralmente pode otimizar essas verificaçÔes e elas podem ser evitadas usando Rust inseguro.

  • NĂłs podemos usar literais para atribuir valores para matrizes.

  • A macro println! pede a implementação de depuração com o parĂąmetro de formato ?: {} dĂĄ a saĂ­da padrĂŁo, {:?} dĂĄ a saĂ­da de depuração. Tipos como inteiros e strings implementam a saĂ­da padrĂŁo, mas matrizes implementam apenas a saĂ­da de depuração. Isso significa que devemos usar a saĂ­da de depuração aqui.

  • 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, p.ex. 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.