O que é r#""# em Rust? Análise completa do operador mágico

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

O que está por trás do misterioso r#""# em Rust? Explicação completa com código



Você já encontrou em código Rust uma notação estranha como r#"..."# e pensou: "Que operador mágico é esse? É alguma sintaxe secreta para poucos?" — você não está sozinho. Milhares de desenvolvedores já fizeram essa pergunta no Stack Overflow, e hoje vamos entender de uma vez por todas o que é isso, para que serve e como usar literais de string bruta (raw string literals) em Rust.



Neste artigo, não vamos apenas dar uma definição seca. Vamos percorrer o caminho do problema à solução, escrever código real, ver como r#""# salva de dores de cabeça e descobrir onde mais essa sintaxe é aplicada. Vamos nessa!



O problema: quando strings comuns quebram o código



Imagine que você está escrevendo um parser JSON ou uma expressão regular. Dentro da string, você precisa usar aspas e barras invertidas. Em código Rust comum, isso parece um pesadelo:



let json_string = "{\\"name\\": \\"Rust\\", \\"year\\": 2015}";let regex = "\\\\d{2}-\\\\d{2}-\\\\d{4}"; // data no formato DD-MM-YYYY


Está vendo isso? Toda vez que você precisa de uma aspa dentro da string, coloca uma barra invertida antes (\\"). E se precisar da própria barra invertida — escreve \\\\. O código rapidamente vira uma "escadinha" de barras, difícil de ler e depurar.



Mas isso é só o começo. E se você precisar inserir um caractere de tabulação na string? Então escreve \\t. E se precisar do texto literal \\t? Precisa escapar: \\\\t. Os olhos já começam a doer na segunda linha.



A solução: strings brutas — r#""#



Rust oferece uma saída elegante — os literais de string bruta. Eles são indicados pelo prefixo r e delimitados por #:



// String bruta: tudo dentro é considerado texto literallet raw_json = r#"{"name": "Rust", "year": 2015}"#;let raw_regex = r#"\\d{2}-\\d{2}-\\d{4}"#;


Sente a diferença? Nada de escape! Aspas internas são apenas aspas. Barras invertidas são apenas barras. O compilador Rust interpreta o conteúdo entre r#" e "# como texto puro, sem tentar interpretar sequências de escape.



Isso é especialmente útil quando você trabalha com:

  • Expressões regulares — cheias de barras e caracteres especiais.
  • JSON, XML, HTML — strings com muitas aspas.
  • Consultas SQL — especialmente com aspas aninhadas.
  • Caminhos de arquivos no Windows — C:\\Users\\Name em vez de C:\\\\Users\\\\Name.
  • Quaisquer dados onde a barra invertida deve permanecer como está.


Como funciona internamente?



Quando Rust encontra r#"..."#, ele simplesmente copia tudo que está entre o r#" inicial e o "# final para a string, sem qualquer processamento. Nenhum vira quebra de linha, nenhum \\t vira tabulação. É um trecho literal de texto.



Mas há um detalhe: o que fazer se dentro da própria string aparecer a sequência "#? Por exemplo, você quer inserir o texto #"hello"#. Se escrever r#"#"hello"#"#, o compilador vai se confundir — onde termina o literal?



Para isso, Rust criou os hashes múltiplos. Você pode usar r##"..."##, r###"..."### e assim por diante. A quantidade de # de ambos os lados deve coincidir:



// String contém "# internamente — usamos hashes duploslet tricky = r##"String com "# dentro"##;println!("{}", tricky); // Exibe: String com "# dentro

// E se houver "## internamente? Então hashes triplos:let very_tricky = r###"Texto com "## den

Blogs

Book Recommendations