Da trilha de Rust Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 e bytes() para iterar sobre bytes.
  • Métodos como len(), contains(), split() e trim() facilitam a manipulação de strings.
slices_strings.rs
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);
}

Exercícios

  1. 1
    Fácil

    Extraindo o primeiro nome

    Dada a string "João Silva", use slices para extrair e imprimir apenas o primeiro nome ("João"). Considere que o nome e o sobrenome são separados por um único espaço.

    Resolver
  2. 2
    Médio

    Contando caracteres e bytes

    Escreva um programa que receba uma string "Rustação" e imprima quantos bytes e quantos caracteres ela possui. Além disso, itere sobre os caracteres e imprima cada um em uma linha separada.

    Resolver
  3. 3
    Desafio

    Invertendo palavras de uma frase

    Dada a frase "Rust é uma linguagem segura e rápida", crie uma nova String com as palavras em ordem inversa, separadas por um espaço. Utilize slices para extrair cada palavra e depois construa a string final. Imprima o resultado.

    Resolver

Continue estudando