Rust Fundamentos Básico
Variáveis e mutabilidade
Em Rust, variáveis são imutáveis por padrão. Isso significa que, depois de declarar let x = 5;, você não pode alterar o valor de x — a menos que use let mut x = 5;. Essa imutabilidade padrão evita muitos bugs e facilita a concorrência, pois o compilador garante que um valor não será modificado inesperadamente.
Além do mut, Rust permite shadowing: declarar uma nova variável com o mesmo nome usando let novamente. A nova variável pode ter outro tipo e "esconde" a anterior. Diferente de mut, o shadowing cria uma nova variável, não modifica a existente.
Para valores constantes, usamos const (constantes em tempo de compilação) e static (variáveis globais com tempo de vida fixo). Constantes não podem ser mut e exigem anotação de tipo. Rust também tem inferência de tipos: na maioria das vezes, o compilador deduz o tipo a partir do valor atribuído, mas em casos ambíguos é preciso anotar explicitamente.
Neste card, você vai praticar let, let mut, shadowing, const, static e inferência — os blocos fundamentais para controlar dados em Rust.
Pontos-chave
- Variáveis declaradas com
letsão imutáveis por padrão; uselet mutpara permitir alterações. - Shadowing (
let x = ...; let x = ...;) cria uma nova variável e pode mudar o tipo. constdefine constantes em tempo de compilação e exige anotação de tipo;staticcria variáveis globais com tempo de vida'static.- Rust infere o tipo na maioria dos casos, mas anotações explícitas são necessárias quando o tipo é ambíguo.
- Tentar modificar uma variável imutável gera erro de compilação.
// Demonstra let, let mut, shadowing, const, static e inferência
const LIMITE: u32 = 100; // constante em tempo de compilação
static NOME: &str = "Rust"; // variável global imutável
fn main() {
// let imutável (tipo inferido como i32)
let x = 5;
println!("x = {x}");
// let mut permite alteração
let mut y = 10;
println!("y antes = {y}");
y += 5;
println!("y depois = {y}");
// Shadowing: nova variável com mesmo nome, tipo diferente
let x = x + 1; // ainda i32
let x = "agora sou string"; // novo tipo &str
println!("x sombreado = {x}");
// Inferência com anotação explícita quando necessário
let z: f64 = 3.14;
println!("z = {z}");
// Usando const e static
println!("LIMITE = {LIMITE}, NOME = {NOME}");
}