String vs str em Rust: principais diferenças com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

String vs str em Rust: por que iniciantes se confundem e como entender de uma vez por todas

\n\n

Se você está começando a aprender Rust, com certeza já passou por esta situação: o compilador reclama, você tenta passar um String onde se espera &str, ou vice-versa. Familiar? Esta é uma das perguntas mais populares no Stack Overflow (milhares de visualizações!), e não é à toa — o tópico é realmente fundamental para entender o gerenciamento de memória em Rust.

\n\n

Neste artigo, vamos entender as diferenças entre String e &str, quando usar cada tipo e como evitar erros típicos. Vamos lá!

\n\n

Resposta rápida para quem está com pressa

\n\n

Se você precisa agora — lembre-se do principal:

\n\n
    \n
  • String — é um tipo de dados proprietário, mutável e dinâmico, armazenado no heap.
  • \n
  • &str — é uma fatia de string imutável (slice) que referencia dados pertencentes a outra pessoa. Geralmente aparece como &str.
  • \n
\n\n

Agora vamos nos aprofundar.

\n\n

O que é String em Rust?

\n\n

String é um tipo que possui seus próprios dados. Quando você cria uma String, a memória é alocada no heap, e a string pode crescer, diminuir ou ser modificada.

\n\n
let mut s = String::from("Olá");\ns.push_str(", mundo!");\nprintln!("{}", s); // Exibirá: Olá, mundo!
\n\n

Aqui, s é o proprietário da string. Quando s sai de escopo, a memória é automaticamente liberada (graças ao RAII — Resource Acquisition Is Initialization).

\n\n

Características principais de String:

\n
    \n
  • Possui os dados (owning type)
  • \n
  • Mutável (mutable)
  • \n
  • Armazenada no heap
  • \n
  • Pode ser criada a partir de um literal de string: String::from("texto")
  • \n
  • Suporta concatenação, inserção e remoção de caracteres
  • \n
\n\n

O que é &str em Rust?

\n\n

&str (pronuncia-se "str-slice" ou "string-slice") é uma referência a uma sequência de caracteres UTF-8 que pertence a outra pessoa. Por si só, &str é apenas um ponteiro para os dados e um comprimento.

\n\n
let saudacao: &str = "Olá";\nprintln!("{}", saudacao);
\n\n

Neste exemplo, saudacao é uma referência a um literal de string armazenado diretamente no arquivo binário do programa (no segmento de memória somente leitura). saudacao não possui esses dados — apenas os observa.

\n\n

Características principais de &str:

\n
    \n
  • Não possui os dados (borrowed type)
  • \n
  • Imutável (immutable)
  • \n
  • Armazenada no binário (literais de string) ou no heap (como fatia de uma String)
  • \n
  • Leve — consiste em dois campos: ponteiro + comprimento (16 bytes em sistemas de 64 bits)
  • \n
  • Ideal para passar para funções quando não é necessário modificar a string
  • \n
\n\n

Diferenças principais entre String e &str (tabela)

\n\n

Vamos resumir tudo em uma tabela visual:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
CaracterísticaString&str
PropriedadePossui os dadosEmpresta os dados
MutabilidadeSim (mut)Não
Onde é armazenadaHeapHeap, pilha ou binário
Tamanho na pilha24 bytes (ptr + len + cap)16 bytes (ptr + len)
CriaçãoString::from("...")"..." ou &s[..]
Uso principalQuando é necessário modificar ou possuir a stringQuando é necessário apenas ler ou passar como referência
\n\n

Continue lendo para exemplos práticos e dicas de boas práticas!

Blogs

Book Recommendations