Pular para o conteúdo
Rust 1.96.0 chega com novos tipos Range, macros assert_matches e melhorias no WebAssembly

Rust 1.96.0 chega com novos tipos Range, macros assert_matches e melhorias no WebAssembly

Versão estável 1.96.0 do Rust traz tipos Range copiáveis, macros de asserção aprimoradas, correções de segurança e ajustes no linking de WebAssembly.

A equipe de desenvolvimento do Rust anunciou a disponibilização da versão estável 1.96.0. O novo release traz aprimoramentos na biblioteca padrão, novas macros de asserção, correções de vulnerabilidades e mudanças importantes no comportamento dos alvos WebAssembly.

Para usuários que já utilizam o rustup, a atualização pode ser feita com um simples comando:

rustup update stable

Caso ainda não tenha o rustup instalado, ele pode ser baixado na página oficial do projeto.

Principais novidades da versão 1.96.0

Novos tipos Range copiáveis

Historicamente, os tipos de intervalo (Range, RangeFrom, RangeInclusive, etc.) não implementavam o traço Copy, o que dificultava o uso em estruturas que exigem cópia simples. O RFC 3550 introduziu uma família de tipos que implementam IntoIterator em vez de Iterator, permitindo que sejam Copy.

A partir desta versão, a biblioteca padrão estabiliza os seguintes tipos em core::range:

  • core::range::Range
  • core::range::RangeFrom
  • core::range::RangeInclusive

Futuras edições deverão incluir ainda core::range::RangeFull e core::range::RangeTo como reexportações de core::ops. Enquanto isso, a sintaxe tradicional 0..1 continua produzindo os tipos legados, que serão migrados nos próximos lançamentos.

Exemplo de uso:

use core::range::Range;

#[derive(Clone, Copy)]
pub struct Span(Range<usize>);

impl Span {
    pub fn of(self, s: &str) -> &str {
        &s[self.0]
    }
}

A nova RangeInclusive também expõe seus campos publicamente, facilitando a inspeção do intervalo.

Macros assert_matches! e debug_assert_matches!

Novas macros foram adicionadas para validar se um valor corresponde a um padrão específico, gerando panic com a representação Debug do valor quando a correspondência falha. Elas são equivalentes a assert!(matches!(...)) e debug_assert!(matches!(...)), porém fornecem mensagens de erro mais informativas.

Como há crates de terceiros que já definem macros com esses nomes, elas não foram incluídas na prelude e precisam ser importadas explicitamente:

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);
}

Alterações nos alvos WebAssembly

Os compiladores para WebAssembly deixaram de passar a flag --allow-undefined ao linker. Agora, símbolos indefinidos provocam erro de linking, evitando a criação automática de imports no módulo "env" e permitindo a detecção precoce de problemas de configuração.

Caso seja necessário restaurar o comportamento antigo, basta usar:

RUSTFLAGS=-Clink-arg=--allow-undefined

ou adicionar #[link(wasm_import_module = "env")] ao bloco que define o símbolo.

APIs estabilizadas

Além das macros citadas, as seguintes APIs ganharam estabilidade:

  • assert_matches! e debug_assert_matches!
  • Implementações de From<T> para AssertUnwindSafe<T>, LazyCell<T, F> e LazyLock<T, F>
  • Vários tipos de intervalo em core::range (RangeToInclusive, RangeFromIter, RangeIter, etc.)

Correções de segurança

A versão 1.96.0 inclui patches para duas vulnerabilidades reportadas por CVE:

CVE Severidade Descrição
CVE‑2026‑5223 Média Extração de tarballs de crates contendo symlinks pode levar a caminhos inesperados.
CVE‑2026‑5222 Baixa Falha na autenticação ao usar URLs normalizadas.

Ambas afetam usuários de registros de crates de terceiros; o repositório oficial crates.io não é impactado.

Como testar as próximas versões

Desenvolvedores interessados em contribuir com testes podem mudar o canal padrão do rustup:

rustup default beta   # para a versão beta
rustup default nightly # para a versão nightly

Qualquer bug encontrado deve ser relatado nos repositórios oficiais.

Impacto para a comunidade

A estabilização dos novos tipos Range simplifica a escrita de APIs que manipulam fatias e intervalos, reduzindo a necessidade de dividir manualmente início e fim. As macros de asserção aprimoram a depuração de padrões, enquanto a mudança no linking de WebAssembly aumenta a confiabilidade dos builds para ambientes de navegadores e runtimes WASM.

Acompanhe todas as mudanças detalhadas em Rust Release Notes e explore as novidades do Cargo e do Clippy na mesma página.

Via blog.rust-lang.org. Você pode conferir o post original em inglês:

The Rust Release Team

Por · Última atualização: