Slide 19 de 74

Os caracteres de uma Str

proc main(): void {
	s := "café au lait"

	echo len(s)                  // 12 caracteres
	echo bytes(s)                // 13 bytes — é ocupa dois

	if s bounds 3 {
		echo s[3]                // é, o quarto caractere
		echo s[0:3]              // café — os dois limites inclusivos
	}

	// Uma posição vinda de indexOf é uma que a string realmente tem,
	// então a fatia tirada nela não precisa de guarda própria.
	if indexOf(s, "au") is Result.Ok(at) {
		echo s[at:]              // au lait
	}

	for each c in split("bee", "") {
		echo c
	}
}

Uma Str é uma sequência de caracteres, e tudo a endereça como tal. len conta caracteres enquanto bytes conta o UTF-8 que eles ocupam, então para "café" são 4 e 5. s[0] é o primeiro caractere, como uma Str de um caractere, e s[1:3] são os caracteres de um a três, os dois limites inclusivos.

Eles são provados dentro dos limites exatamente como os de um vetor, com uma diferença: uma string nunca tem um tamanho que o compilador conheça, porque não existe Str[3] para texto. Então até s[1] em um literal bem ali precisa de uma guarda, ou de uma posição que indexOf respondeu.

Nada escreve dentro de uma Str: s[0] = "x" é um erro de compilação, porque caracteres não têm todos a mesma largura e escrever um moveria todos os caracteres depois dele. Construa a string nova em vez disso. for each também não percorre uma Str — split(s, "") são os caracteres dela, como um vetor.