Slide 16 de 74

Vetores

proc main(): void {
	v := ["a", "b", "c"]            // Str[3] — um tamanho estático, inferido
	mut Str[dyn] w = ["a", "b"]     // dinâmico — o único tipo que append aceita
	append(w, "c")

	echo v[0]                       // a
	echo v[0:1]                     // ["a", "b"] — os dois limites inclusivos
	echo v[1:]                      // ["b", "c"]
	echo v == ["a", "b", "c"]       // true — elemento por elemento

	Str[3][2] grid = [["a", "b", "c"], ["d", "e", "f"]]
	echo grid[1][2]                 // f — duas linhas de três
}

Um vetor guarda elementos de um só tipo, lado a lado na memória, e seu tipo diz o tamanho dele:

  • Str[3] é estático: exatamente três, sempre. v := ["a", "b", "c"] é um — um tamanho lido do valor é um tamanho do mesmo jeito.
  • Str[dyn] é dinâmico: não promete nada sobre o tamanho, e é o único tipo que append, prepend e drop alteram. Ele precisa ser escrito, como mut Str[dyn] v = ….
  • Str[] é uma grafia só para parâmetros, que aceita qualquer um dos dois.

Um vetor de vetores se lê da esquerda para a direita: Str[3][2] são dois vetores de três, então grid[1][2] é a última célula da segunda linha. v[i] lê um elemento e v[lo:hi] fatia com os dois limites inclusivos, então v[0:1] são dois elementos; qualquer um dos limites pode ser omitido. Todo índice e toda fatia são provados dentro dos limites quando o programa compila — o próximo slide mostra como. + junta dois vetores em um novo, e == os compara elemento por elemento.