Anuncian Rust 1.96.0
(blog.rust-lang.org)- Rust 1.96.0 se puede instalar con
rustup update stable, y la verificación de futuras versiones estará abierta en los canales beta/nightly - Los nuevos tipos
core::range::Range*implementan IntoIterator en vez deIterator, lo que permite implementarCopy, y en el futuro serán los tipos base de la sintaxis de rangos - assert_matches! y
debug_assert_matches!ahora muestran también la representaciónDebugdel valor cuando el patrón no coincide, facilitando el diagnóstico de fallas en pruebas - Los targets de WebAssembly ya no pasan
--allow-undefinedpor defecto, así que los símbolos no definidos ahora provocan un error del linker en lugar de convertirse en imports - Cargo incluye correcciones para CVE-2026-5223 y
CVE-2026-5222para usuarios de registros de terceros, y los usuarios de crates.io no se ven afectados
Cambios principales de Rust 1.96.0
-
Actualización y canales de prueba
- Los usuarios que ya tengan Rust instalado con
rustuppueden obtener Rust 1.96.0 conrustup update stable - Si no tienes
rustup, puedes instalarlo desde la página de instalación derustupdel sitio web de Rust, y también ya están publicadas las notas detalladas de la versión 1.96.0 - Si quieres participar en la verificación de futuras versiones, puedes usar los canales beta/nightly con
rustup default betaorustup default nightly, y reportar bugs en el issue tracker de Rust
- Los usuarios que ya tengan Rust instalado con
-
Nuevos tipos
Range*- Muchos usuarios esperaban que
Rangey los tipos relacionados decore::opsimplementaranCopy, pero no lo hacían porque implementanIteratordirectamente - Implementar
IteratoryCopya la vez en el mismo tipo es un footgun que Clippy señala, por eso se había evitado - RFC3550 propuso tipos alternativos de rango que implementan
IntoIteratoren vez deIterator, y con esa estructura esos tipos también pueden implementarCopy - En la librería estándar se estabilizaron
core::range::Range,core::range::RangeFrom,core::range::RangeInclusivey sus iteradores relacionados - En una versión cercana de Rust también se agregarán
core::range::RangeFullycore::range::RangeTo, reexportados desdecore::ops, además decore::range::legacy::*, que será la nueva ubicación de los tipos de rango actuales - La sintaxis de rangos como
0..1hoy crea tipos legacy, pero en una futura edición cambiará a los tipos decore::range - Con esta nueva estabilización, ahora se pueden guardar accesores de slices en tipos
Copysin tener que separarstartyend - Ejemplo:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - El nuevo
RangeInclusivehace públicos sus campos, ya que ya no necesita evitar exponer el estado de un iterador consumido como ocurría con la versión legacy - Como los nuevos tipos primero deben convertirse antes de comenzar a iterarse, los campos públicos no representan un problema
- Se recomienda a los autores de librerías considerar el uso de
impl RangeBoundsen APIs públicas para aceptar tanto los tipos de rango legacy como los nuevos - Si se necesita un tipo concreto, se recomienda preferir los nuevos tipos de rango, que serán el valor por defecto en el futuro
- Muchos usuarios esperaban que
-
Macros de aserción para pattern matching
- Las nuevas macros
assert_matches!ydebug_assert_matches!verifican si un valor coincide con un patrón dado y, si no coincide, hacen panic junto con la representaciónDebugde ese valor - En esencia son equivalentes a
assert!(matches!(..))ydebug_assert!(matches!(..)), pero mejoran la capacidad de diagnóstico gracias al valor que se imprime cuando fallan - No se agregaron al preludio estándar porque podrían entrar en conflicto con crates populares de terceros que ya ofrecen macros con el mismo nombre
- Antes de usarlas hay que importarlas directamente desde
coreostd - Ejemplo:
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); }
- Las nuevas macros
-
Cambio en los targets de WebAssembly
- Los targets de WebAssembly ya no pasan
--allow-undefinedal linker - Durante el enlace, los símbolos no definidos ya no se convierten en imports de WebAssembly del módulo
"env", sino que ahora generan un error del linker - Si todos los símbolos relacionados con el enlace deben estar definidos para que el módulo enlace, se pueden detectar bugs antes y evitar problemas accidentales causados, por ejemplo, por nombres de símbolos
- Los símbolos no definidos relacionados con el enlace suelen indicar bugs en tiempo de compilación o errores de configuración
- Si el comportamiento anterior era intencional, se puede restaurar con
RUSTFLAGS=-Clink-arg=--allow-undefined, o usar#[link(wasm_import_module = "env")]en el bloque donde se define el símbolo en el código fuente - Este cambio se aplica en Rust 1.96 después del anuncio previo en el blog
- Los targets de WebAssembly ya no pasan
APIs estabilizadas y correcciones de seguridad
-
APIs estabilizadas
-
Dos avisos de seguridad de Cargo
- Rust 1.96 incluye correcciones para dos vulnerabilidades de Cargo que afectan a usuarios de registros de terceros
- CVE-2026-5223 es una vulnerabilidad de gravedad media relacionada con la extracción de tarballs de crates que contienen enlaces simbólicos
- CVE-2026-5222 es una vulnerabilidad de gravedad baja relacionada con autenticación mediante URLs normalizadas
- Los usuarios de crates.io no se ven afectados por ninguna de las dos vulnerabilidades
-
Cambios adicionales
1 comentarios
Opiniones en Lobste.rs
assert_matcheses de esas cosas que siempre termino queriendo tener, y cada vez me hace dudar entre agregar otro crate o volver a implementarlo yo mismoAsí que me alegra que entre en la biblioteca estándar
Me gusta el paso hacia hacer que los rangos sean de tipo
CopyA veces me ha sorprendido tener que clonar rangos, y también encaja mejor con la intuición de que
12..34debería ser un dato pequeño y copiableEso sí, si empiezan a existir varios tipos con el mismo nombre, me preocupa un poco que VS Code termine importando el tipo equivocado la próxima vez que agregue automáticamente una declaración
usePara la mayoría de los usuarios, la ventaja de los tipos nuevos es pequeña, así que pueden seguir usando los tipos existentes, y en el siguiente cambio de edición los tipos nuevos pasarán a usarse automáticamente
Me imagino que quienes más van a importar estos tipos serán los autores de bibliotecas que quieran dar soporte explícito a ambas versiones
Puedes cambiar el preludio sin romper los proyectos existentes