Lançado o Rust 1.96.0
(blog.rust-lang.org)- Rust 1.96.0 pode ser instalado com
rustup update stable, e a validação de futuras releases pode ser feita nos canais beta/nightly - Os novos tipos
core::range::Range*implementam IntoIterator em vez deIterator, o que permite implementarCopye deve torná-los os tipos padrão da sintaxe de intervalos no futuro - assert_matches! e
debug_assert_matches!agora exibem também a representaçãoDebugdo valor quando o padrão não corresponde, facilitando o diagnóstico de falhas em testes - Os alvos WebAssembly não passam mais
--allow-undefinedpor padrão, então símbolos indefinidos agora geram erro de linker em vez de virar imports - O Cargo inclui correções para CVE-2026-5223 e
CVE-2026-5222para usuários de registros de terceiros; usuários do crates.io não são afetados
Principais mudanças no Rust 1.96.0
-
Atualização e canais de teste
- Usuários que instalaram o Rust existente com
rustuppodem obter o Rust 1.96.0 comrustup update stable - Se você não tiver o
rustup, pode instalá-lo na página de instalação dorustupno site do Rust, e asnotas detalhadas de release da 1.96.0também já foram publicadas - Para participar da validação de futuras releases, você pode usar os canais beta/nightly com
rustup default betaourustup default nightly, e bugs podem ser reportados no rastreador de issues do Rust
- Usuários que instalaram o Rust existente com
-
Novos tipos
Range*- O
Rangeexistente e os tipos relacionados emcore::opssão algo que muitos usuários esperam que sejaCopy, mas eles não implementavamCopyporque implementamIteratordiretamente - Implementar
IteratoreCopyao mesmo tempo no mesmo tipo é uma armadilha apontada pelo Clippy, por isso isso vinha sendo evitado - A RFC3550 propôs tipos alternativos de intervalo que implementam
IntoIteratorem vez deIterator, e nessa estrutura esses tipos também podem implementarCopy - Na biblioteca padrão, foram estabilizados
core::range::Range,core::range::RangeFrom,core::range::RangeInclusivee os iteradores relacionados - Em uma versão próxima do Rust, também devem ser adicionados
core::range::RangeFullecore::range::RangeTo, reexportados decore::ops, além decore::range::legacy::*, que será o novo local dos tipos de intervalo atuais - A sintaxe de intervalos, como
0..1, hoje cria tipos legados, mas em uma edição futura passará a usar os tipos decore::range - Com essa nova estabilização, passa a ser possível armazenar indexadores de slice em tipos
Copysem precisar separarstarteend - Exemplo:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - O novo
RangeInclusiveexpõe seus campos, já que não há necessidade de evitar, como na versão legada, a exposição do estado de iterador esgotado - Como os novos tipos precisam primeiro ser convertidos antes de iniciar a iteração, campos públicos não se tornam um problema
- Autores de bibliotecas devem considerar usar
impl RangeBoundsem APIs públicas para aceitar tanto os tipos legados quanto os novos tipos de intervalo - Se for necessário um tipo concreto, a recomendação é preferir os novos tipos de intervalo, que devem se tornar o padrão no futuro
- O
-
Macros de asserção para pattern matching
- As novas macros
assert_matches!edebug_assert_matches!verificam se um valor corresponde a um padrão e, se não corresponder, fazem panic junto com a representaçãoDebugdesse valor - As duas macros são essencialmente equivalentes a
assert!(matches!(..))edebug_assert!(matches!(..)), mas o valor mostrado em caso de falha melhora a capacidade de diagnóstico - Como podem entrar em conflito com crates populares de terceiros que já oferecem macros com o mesmo nome, elas não foram adicionadas ao prelúdio padrão
- Antes de usar, é preciso importá-las diretamente de
coreoustd - Exemplo:
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
- As novas macros
-
Mudança nos alvos WebAssembly
- Os alvos WebAssembly não passam mais
--allow-undefinedpara o linker - Durante a linkedição, símbolos indefinidos não são mais convertidos em imports WebAssembly do módulo
"env"; agora isso gera erro de linker - Como o módulo não será linkado se todos os símbolos relacionados à linkedição não estiverem definidos, isso ajuda a detectar bugs mais cedo e evita problemas acidentais causados, por exemplo, por nomes de símbolos
- Símbolos indefinidos relacionados à linkedição normalmente indicam um bug em tempo de build ou um erro de configuração
- Se o comportamento antigo era intencional, ele pode ser restaurado com
RUSTFLAGS=-Clink-arg=--allow-undefined, ou pode-se usar#[link(wasm_import_module = "env")]no bloco que define o símbolo no código-fonte - Essa mudança passa a valer no Rust 1.96 após o aviso anterior no blog
- Os alvos WebAssembly não passam mais
APIs estabilizadas e correções de segurança
-
APIs estabilizadas
-
Dois avisos de segurança no Cargo
- O Rust 1.96 inclui correções para duas vulnerabilidades do Cargo que afetam usuários de registros de terceiros
- A CVE-2026-5223 é uma vulnerabilidade de gravidade média relacionada à extração de tarballs de crates com links simbólicos
- A CVE-2026-5222 é uma vulnerabilidade de baixa gravidade relacionada à autenticação via URLs normalizadas
- Usuários do crates.io não são afetados por nenhuma das duas vulnerabilidades
-
Mudanças adicionais
1 comentários
Opiniões no Lobste.rs
Eu sempre acabo querendo
assert_matches, e toda vez fico em dúvida se adiciono mais um crate ou se reimplemento por conta própriaEntão fico feliz em vê-lo entrando na biblioteca padrão
Gosto da etapa de transformar ranges em tipos
CopyJá me surpreendi algumas vezes por precisar clonar ranges, e isso também combina melhor com a intuição de que
12..34deveria ser um dado pequeno e copiávelSó fico um pouco preocupado que, se começarem a existir vários tipos com o mesmo nome, o VS Code acabe importando o tipo errado na próxima vez que adicionar automaticamente uma declaração
usePara a maioria dos usuários, a vantagem dos novos tipos é pequena, então dá para continuar usando os tipos antigos, e na fronteira da próxima edition os novos tipos passarão a ser usados automaticamente
Imagino que quem mais vai importar esses tipos serão autores de bibliotecas que queiram dar suporte explícito às duas versões
Dá para mudar o prelude sem quebrar projetos existentes