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.