Variáveis, Mutabilidade e Shadowing
let cria vinculações. Imutabilidade é o padrão; mut opta pela reatribuição. Shadowing permite reutilizar um nome com um novo tipo ou valor sem tornar tudo mutável.
Busque em todas as páginas da documentação
let cria vinculações. Imutabilidade é o padrão; mut opta pela reatribuição. Shadowing permite reutilizar um nome com um novo tipo ou valor sem tornar tudo mutável.
const MAX_RETRIES: u32 = 3;
fn main() {
let input = "42";
let input: u32 = input.parse().unwrap();
let mut attempts = 0;
attempts += 1;
println!("parseado {input}, tentativa {attempts}, máximo {MAX_RETRIES}");
}Quando usar isso: Sempre que precisar de estado local claro. Prefira vinculações let imutáveis e shadowing em vez de espalhar mut por toda parte.
const DEFAULT_PORT: u16 = 8080;
fn parse_port(raw: &str) -> u16 {
let raw = raw.trim();
let port: u16 = raw.parse().expect("porta deve ser um número");
port
}
fn main() {
let mut log_level = "info";
log_level = "debug";
let port = parse_port(" 3000 ");
println!("porta={port}, log={log_level}, padrão={DEFAULT_PORT}");
}O que isso demonstra:
const para constantes de tempo de compilação com tipos explícitosraw após o trim sem mutmut apenas onde a reatribuição é necessária (log_level)let introduz uma nova vinculação no escopo atualx = 1 falha)mut permite a reatribuição da própria vinculaçãolet vs const vs static| Forma | Avaliado | Tipo exigido | Uso |
|---|---|---|---|
let | Tempo de execução | Inferido ou anotado | Variáveis locais |
const | Tempo de compilação | Obrigatório | Constantes em nível de módulo |
static | Tempo de execução (endereço fixo) | Obrigatório | Singletons globais, FFI |
const KB: u32 = 1024;
static APP_NAME: &str = "myapp";Shadowing é comum em cadeias de análise:
let spaces = " ";
let spaces = spaces.len(); // agora usize, não &strAo contrário de mut, shadowing pode mudar o tipo porque cada let é uma nova vinculação.
let (x, y) = (1, 2);
let [first, ..] = [10, 20, 30];A desestruturação em vinculações let desempacota tuplas, arrays e structs em uma única etapa.
mut quando shadowing é suficiente - Pipelines de análise se tornam mais difíceis de seguir. Correção: Use shadowing com let parsed = input.parse()? em vez de mutar um buffer de string.let x = Rc::new(RefCell::new(0)) não precisa de mut em x para chamar borrow_mut. Correção: Entenda que mut é sobre a vinculação, não sobre o conteúdo do heap.const não pode usar String::from em tempo de execução. Correção: Use const para literais; use static ou lazy_static/OnceLock para inicialização em tempo de execução.let _ = expensive(); ainda executa a expressão. Correção: Prefira _ apenas quando o efeito colateral ou o descarte for intencional.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Shadowing (reutilização de let) | Pipelines de análise/transformação, mudanças de tipo | Funções longas onde a reutilização de nomes confunde os leitores |
Vinculação mut | Contadores de loop, construtores incrementais | A maioria dos valores locais que são definidos uma vez |
const | Números mágicos, limites fixos | Valores computados em tempo de execução a partir da configuração |
Cell/RefCell | Mutação compartilhada por trás de vinculação imutável | Você pode usar &mut com acesso exclusivo |
Torna o fluxo de dados mais fácil de raciocinar e permite que o verificador de empréstimos prove a segurança. A mutação é explícita via mut.
Sim. let mut x = 1; let x = 2; cria uma nova vinculação imutável que oculta a mutável.
Valores const são incorporados em tempo de compilação. Eles não ocupam espaço na pilha como variáveis em tempo de execução.
static tem um endereço de memória fixo para a duração do programa. const é um valor de tempo de compilação copiado onde é usado.
Sim. pub const TIMEOUT_MS: u64 = 5000; é comum em crates de biblioteca.
Não. Shadowing cria uma nova vinculação. Reatribuição (mut) atualiza a mesma vinculação.
Sim. let Point { x, y } = point; e let Some(v) = opt else { return }; (let-else) são idiomáticos.
Mesmo vinculações não utilizadas podem mover a propriedade, a menos que o tipo seja Copy. Use o prefixo _ se você intencionalmente ignorar um valor movido.
Sim, mas isso permite apenas reatribuir a vinculação de parâmetro local. Não afeta o chamador.
Evite static mut. Prefira OnceLock, Mutex ou dados const. static mut requer unsafe para ler/escrever.
letVersões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026