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-YYYYEstá 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\\Nameem vez deC:\\\\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