Rust Strings Básico
Slices e strings
Em Rust, texto pode ser representado por dois tipos principais: String (uma string mutável, alocada no heap, que possui seus dados) e &str (uma string slice, uma referência imutável a uma sequência de bytes UTF-8 válidos). &str é uma visão emprestada de uma string, podendo apontar para um literal estático ou para um pedaço de uma String. Essa distinção é fundamental para entender posse e empréstimo em Rust.
Slices (&[T]) são referências a uma sequência contígua de elementos de um array ou vetor. A sintaxe &var[inicio..fim] cria um slice que vai do índice inicio até fim - 1. Strings também podem ser fatiadas com &s[inicio..fim], mas os índices precisam estar em limites de caracteres UTF-8 válidos, caso contrário o programa entra em pânico.
Rust garante que strings são sempre UTF-8 válido. Isso significa que um caractere pode ocupar mais de um byte (por exemplo, 'á' ocupa 2 bytes, '😊' ocupa 4). Portanto, indexar uma string com s[0] não compila; é preciso usar slices com intervalos de bytes ou iterar sobre chars().
Métodos comuns incluem len() (tamanho em bytes), is_empty(), chars(), bytes(), contains(), starts_with(), ends_with(), split(), trim(), to_string() e to_uppercase(). Praticar esses métodos ajuda a manipular texto de forma segura e idiomática.
Pontos-chave
Stringé dona dos dados e mutável;&stré um empréstimo imutável de uma sequência UTF-8.- Slices de string usam intervalos de bytes:
&s[2..5]— os índices precisam cair em limites de caracteres. - Rust não permite indexar string com
s[0]porque um caractere pode ter múltiplos bytes. - Use
chars()para iterar sobre caracteres ebytes()para iterar sobre bytes. - Métodos como
len(),contains(),split()etrim()facilitam a manipulação de strings.
fn main() {
// String: dona dos dados, mutável
let mut saudacao = String::from("Olá, mundo!");
saudacao.push_str(" Bem-vindo!");
println!("String: {}", saudacao);
// &str: empréstimo imutável (string slice)
let fatia: &str = &saudacao[0..3]; // "Olá"
println!("Slice: {}", fatia);
// UTF-8: 'á' tem 2 bytes, então len() conta bytes
println!("Bytes: {}", saudacao.len());
println!("Chars: {}", saudacao.chars().count());
// Iterando sobre caracteres
for c in "Rust".chars() {
print!("{} ", c);
}
println!();
// Métodos comuns
let texto = " Rust é divertido! ";
println!("Trim: '{}'", texto.trim());
println!("Contém 'divertido': {}", texto.contains("divertido"));
println!("Maiúsculas: {}", texto.trim().to_uppercase());
// Split
let frase = "maçã,banana,uva";
for fruta in frase.split(',') {
println!("Fruta: {}", fruta);
}
// Slices de arrays também funcionam
let numeros = [10, 20, 30, 40, 50];
let meio = &numeros[1..4]; // [20, 30, 40]
println!("Slice de array: {:?}", meio);
}