Inicialização de Structs em Rust: Guia Rápido e Truques Avançados

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 inicializar structs em Rust não é chato?

\n\n

Se 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!".

\n\n

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\n

Neste 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\n

Pronto para acelerar seu trabalho com structs em Rust? Vamos nessa!

\n\n

1. A forma clássica: nomeação explícita dos campos

\n\n

Vamos começar pelo básico. Suponha que temos uma struct Usuario:

\n\n
struct Usuario {\n    nome_usuario: String,\n    email: String,\n    qtd_logins: u64,\n    ativo: bool,\n}
\n\n

A inicialização padrão fica assim:

\n\n
let usuario1 = Usuario {\n    email: String::from("alguem@exemplo.com"),\n    nome_usuario: String::from("usuario123"),\n    ativo: true,\n    qtd_logins: 1,\n};
\n\n

Tudo 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.

\n\n

A boa notícia: Rust também sente isso. E criou uma solução.

\n\n

2. Field Init Shorthand: quando o nome da variável coincide com o campo

\n\n

A 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\n
let 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\n

Bonito, 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.

\n\n

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\n

3. Struct Update Syntax: copiando uma struct com alterações

\n\n

Suponha que já temos usuario1 e queremos criar usuario2, alterando apenas o email. Será que precisamos reescrever todos os campos? Não!

\n\n
let usuario2 = Usuario {\n    email: String::from("outro@exemplo.com"),\n    ..usuario1  // os demais campos vêm de usuario1\n};
\n\n

O 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.

\n\n

Essa sintaxe economiza muitas linhas quando você trabalha com inicialização de structs em Rust baseada em dados existentes.

\n\n

4. A trait Default: inicialização com valores padrão

\n\n

E se a maioria dos campos tiver valores padrão? Por exemplo, ativo: true e qtd_logins: 0? Você pode implementar a trait Default:

\n\n
#[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\n

Mas calma!

Blogs

Book Recommendations