Colando strings em Rust: TOP-5 erros de iniciantes (e como evitá-los)

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

Introdução: Por que no Rust não se pode simplesmente somar strings?

\n\n

Se você migrou para Rust vindo de Python ou JavaScript, a primeira coisa que provavelmente te chocou foi a tentativa de escrever "Hello, " + "world!". O compilador te recebe com uma onda vermelha e uma mensagem de erro misteriosa. No mundo Python, isso funcionaria instantaneamente, mas Rust é um bicho diferente. A pergunta "How do I concatenate strings?" no Stack Overflow acumulou centenas de milhares de visualizações, e não é por acaso.

\n\n

O problema é que a concatenação de strings em Rust não é apenas açúcar sintático. É uma questão de gerenciamento de memória, propriedade (ownership) e tipos de dados. Se você é iniciante, pode facilmente cair nos clássicos erros: perder a propriedade de uma string, copiar gigabytes de dados acidentalmente ou simplesmente se confundir entre String e &str.

\n\n

Neste artigo, vamos analisar 5 erros mais comuns que iniciantes cometem ao colar strings em Rust e mostrar como evitá-los. Você aprenderá quando usar +, quando usar format! e quando usar push_str. Vamos lá!

\n\n

Erro nº 1: Esquecer da tomada de posse (ownership)

\n\n

Como parece

\n\n

Imagine que você está escrevendo o código:

\n\n
let s1 = String::from("Olá");\nlet s2 = String::from(", mundo!");\nlet s3 = s1 + &s2; // Erro? Ou não?\nprintln!("{}", s1); // Erro de compilação!
\n\n

Você espera que s1 permaneça acessível, mas o compilador diz: "Não, s1 foi movido (moved)".

\n\n

Qual é a essência do erro

\n\n

Em Rust, o operador + para strings usa a assinatura fn add(self, s: &str) -> String. Observe o self — isso significa que a primeira string é consumida (consumes) e você não pode mais usá-la. Você literalmente "entrega" s1 para a função add, e ela se torna inacessível.

\n\n

Como corrigir

\n\n

Existem dois caminhos:

\n\n
    \n
  • Clonar a string (se você precisar da original): let s3 = s1.clone() + &s2;
  • \n
  • Mudar a ordem ou usar format!:
  • \n
\n\n
let s1 = String::from("Olá");\nlet s2 = String::from(", mundo!");\nlet s3 = format!("{}{}", s1, s2); // s1 e s2 permanecem acessíveis\nprintln!("{}", s1); // Funciona!
\n\n

Dica: Se você não planeja usar s1 após a concatenação, use + sem medo. É mais rápido que format!, pois não cria um novo buffer do zero.

\n\n

Erro nº 2: Confusão entre String e &str

\n\n

Como parece

\n\n

Você tenta somar uma String com um literal:

\n\n
let s = String::from("Hello");\nlet result = s + " world"; // Funciona!
\n\n

Mas se você tentar o contrário:

\n\n
let s = "Hello";\nlet result = s + String::from(" world"); // Erro!
\n\n

Qual é a essência do erro

\n\n

O operador + funciona apenas quando o lado esquerdo é uma String e o lado direito é &str. O literal " world" é automaticamente &str, então o primeiro exemplo funciona. No segundo exemplo, s é &str, que não possui o método add.

\n\n

Como corrigir

\n\n

Converta &str para String ou use format!:

\n\n
let s = "Hello";\nlet result = format!("{} {}", s, "world"); // Método universal\n// Ou\nlet result = s.to_string() + " world"; // to_string() cria uma String
\n\n

Regra de ouro: String é um tipo proprietário (owned), &str é um empréstimo (borrow). A concatenação sempre exige propriedade à esquerda.

\n\n

Erro nº 3

Blogs

Book Recommendations