Introdução: Por que inicializar structs em Rust não é chato?
\n\nSe você já escreveu código em Rust, com certeza já passou por aquela situação em que pensa: "Por que eu tenho que ficar repetindo campo: campo? Isso é óbvio!".
Sim, Rust é uma linguagem rigorosa, exigente e incrivelmente expressiva. Mas até ela tem espaço para um açúcar sintático que deixa o código mais curto, limpo e agradável aos olhos. Isso vale especialmente para a inicialização de structs — aquela tarefa repetitiva que fazemos dezenas de vezes por dia.
\n\nNeste artigo, não vamos apenas responder à pergunta popular do Stack Overflow: "Existe uma maneira mais rápida/curta de inicializar variáveis em uma struct Rust?". Vamos explorar todas as abordagens — das básicas às avançadas — e mostrar como escrever código que seja ao mesmo tempo rápido, legível e idiomático em Rust.
\n\nPronto para acelerar seu trabalho com structs em Rust? Vamos nessa!
\n\n1. A forma clássica: nomeação explícita dos campos
\n\nVamos começar pelo básico. Suponha que temos uma struct Usuario:
struct Usuario {\n nome_usuario: String,\n email: String,\n qtd_logins: u64,\n ativo: bool,\n}\n\nA inicialização padrão fica assim:
\n\nlet usuario1 = Usuario {\n email: String::from("alguem@exemplo.com"),\n nome_usuario: String::from("usuario123"),\n ativo: true,\n qtd_logins: 1,\n};\n\nTudo certo, tudo explícito. Mas quando você tem 10 ou 15 campos, e os nomes das variáveis coincidem com os nomes dos campos — isso começa a irritar. Você escreve email: email e se sente um burocrata preenchendo formulários.
A boa notícia: Rust também sente isso. E criou uma solução.
\n\n2. Field Init Shorthand: quando o nome da variável coincide com o campo
\n\nA partir do Rust 1.17, você pode usar uma sintaxe reduzida quando o nome da variável é igual ao nome do campo da struct. Isso se chama field init shorthand.
\n\nlet email = String::from("alguem@exemplo.com");\nlet nome_usuario = String::from("usuario123");\n\nlet usuario1 = Usuario {\n email, // ao invés de email: email\n nome_usuario, // ao invés de nome_usuario: nome_usuario\n ativo: true,\n qtd_logins: 1,\n};\n\nBonito, não é? O Rust entende sozinho que email é tanto a variável quanto o campo. Esse truque é especialmente útil quando você passa parâmetros para funções que já têm nomes significativos.
Quando usar: sempre que o nome da variável coincidir com o nome do campo. Isso não é apenas "escrever mais rápido" — é a forma idiomática de escrever Rust.
\n\n3. Struct Update Syntax: copiando uma struct com alterações
\n\nSuponha que já temos usuario1 e queremos criar usuario2, alterando apenas o email. Será que precisamos reescrever todos os campos? Não!
let usuario2 = Usuario {\n email: String::from("outro@exemplo.com"),\n ..usuario1 // os demais campos vêm de usuario1\n};\n\nO operador .. é a struct update syntax. Ele diz ao compilador: "Pegue todos os campos restantes de usuario1". Importante: após isso, usuario1 será parcialmente movido (se os campos não implementarem Copy), então cuidado com a posse.
Essa sintaxe economiza muitas linhas quando você trabalha com inicialização de structs em Rust baseada em dados existentes.
\n\n4. A trait Default: inicialização com valores padrão
\n\nE se a maioria dos campos tiver valores padrão? Por exemplo, ativo: true e qtd_logins: 0? Você pode implementar a trait Default:
#[derive(Default)]\nstruct Usuario {\n nome_usuario: String,\n email: String,\n ativo: bool,\n qtd_logins: u64,\n}\n\n// Agora:\nlet usuario_padrao = Usuario::default();\n// nome_usuario: "", email: "", ativo: false, qtd_logins: 0\n\nMas calma!