Rust em 2025: o que há de novo? Possibilidades práticas
2025 tornou-se um ano marcante para o ecossistema Rust. A linguagem, que já conquistou os corações de programadores de sistemas, desenvolvedores web e criadores de ferramentas de linha de comando, recebeu uma série de atualizações há muito esperadas. Se em 2023-2024 a atenção principal estava na estabilização e melhoria das ferramentas, em 2025 o foco mudou para a simplificação radical da escrita de código complexo e o aumento do desempenho sem perda de segurança.
Neste artigo, analisaremos três inovações principais que já estão disponíveis na versão estável do Rust 2025 e as mostraremos com exemplos concretos. Se você acompanha o desenvolvimento do Rust ou está apenas começando a conhecê-lo, este material o ajudará a se atualizar rapidamente.
1. Iteradores assíncronos: async gen e async for
Um dos tópicos mais comentados em 2025 foi a estabilização de geradores e iteradores assíncronos. Antes, escrever um iterador assíncrono exigia a implementação manual da trait Stream ou o uso de crates de terceiros. Agora tudo ficou mais simples e elegante.
A principal novidade é a palavra-chave async combinada com gen e a possibilidade de usar async for em loops. Isso permite escrever código que gera e consome sequências de dados de forma assíncrona, sem bloquear o fluxo de execução.
Exemplo: Gerador assíncrono de números de Fibonacci
use std::time::Duration;use tokio::time::sleep;
// Gerador assíncrono que "emite" números de Fibonacci com atrasoasync fn async_fibonacci(limit: u32) -> impl AsyncIterator<Item = u64> { async gen { let (mut a, mut b) = (0, 1); for _ in 0..limit { sleep(Duration::from_millis(100)).await; // Simulação de trabalho assíncrono yield b; // Palavra-chave yield let next = a + b; a = b; b = next; } }}
#[tokio::main]async fn main() { println!("Números de Fibonacci assíncronos (primeiros 10):"); // Usamos async for para consumir async for number in async_fibonacci(10) { println!("Recebido: {}", number); } println!("Pronto!");}O que isso proporciona na prática?
- Simplificação do código: Não é mais necessário escrever combinadores complexos do crate
futures. - Legibilidade: O código se parece com um gerador síncrono comum, mas funciona de forma assíncrona.
- Desempenho: O compilador otimiza essas construções, minimizando a sobrecarga.
Isso é especialmente útil para processar fluxos de dados da rede, ler arquivos grandes ou trabalhar com conexões WebSocket.
2. Borrow checker aprimorado: Polonius estabilizado
O borrow checker é a "alma" do Rust, responsável pela segurança da memória sem um coletor de lixo. No entanto, iniciantes (e até desenvolvedores experientes) frequentemente enfrentavam situações em que o compilador rejeitava código perfeitamente seguro. Em 2025, o modelo de empréstimo Polonius finalmente se tornou parte do compilador estável.
Polonius usa uma análise de fluxo de dados mais precisa, permitindo que o compilador "entenda" padrões mais complexos de trabalho com referências.
Exemplo: O problema dos "dois empréstimos mutáveis"
Antes, este código não compilava:
fn push_and_pop(vec: &mut Vec<i32>) -> &i32 { vec.push(1); // Erro: não é possível pegar uma referência mutável (push) e depois uma imutável (pop) let last = vec.last().unwrap(); last}No Rust 2025 com Polonius, isso funciona! O compilador percebe que, após o push, a referência mutável não é mais usada e permite pegar uma referência imutável para o último elemento. Veja como