El equipo de Rust ha publicado la versión 1.100.0 del lenguaje, con dos estabilizaciones que llevaban años en nightly: el tipo never (!) y el núcleo de la API de asignadores. Cargo, por su parte, incorpora avisos de dependencias sin usar y una opción para no instalar versiones recién publicadas.
El tipo never ya se puede nombrar
El tipo ! es estable y puede escribirse en cualquier posición, por ejemplo Result<T, !> para expresar que un error es imposible. Infallible pasa a ser un alias de !. Hay una nota de compatibilidad: en las ediciones 2015, 2018 y 2021 el tipo de reserva (fallback) del never type cambia de () a !. Rara vez se nota, pero el compilador puede marcar más código como inalcanzable.
API Allocator estable
Se estabiliza el núcleo de allocator_api: el trait Allocator y los asignadores Global y System, con métodos como Vec::new_in, Vec::with_capacity_in o Box::new_in, y con soporte en Box, Rc y Arc. Forma parte del objetivo «Allocators 1.0» y abre la puerta a usar arenas o asignadores propios en Rust estable.
DropGuard y conjure_zst
core::mem::DropGuard ejecuta un cierre cuando se destruye, implementa Deref y DerefMut y ofrece DropGuard::dismiss para recuperar el valor sin lanzar el cierre; resulta útil para deshacer cambios (rollback) si algo falla a mitad. Además llega std::mem::conjure_zst, una función unsafe que pasa a ser la vía recomendada para crear un valor de un tipo de tamaño cero.
Novedades en Cargo
- Dependencias sin usar: Cargo avisa de
unused dependency, configurable concargo::unused_dependenciesen la nueva tabla[lints.cargo]. Solo avisa si se compilan todos los destinos que podrían usar la dependencia, y no se aplica adev-dependencies. - Directorio de compilación: el hash de configuración de la compilación se aplica ahora de forma coherente, lo que reduce colisiones de caché. Los procesos o pruebas que dependan del comportamiento anterior pueden romperse.
- Cuarentena de versiones: con
global-min-publish-age = "3 days"en la sección[registry]de.cargo/config.toml, Cargo omite versiones publicadas hace poco, una defensa útil frente a ataques a la cadena de suministro. Se puede saltar en una actualización conCARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow;cargo installignora el mínimo.
APIs estabilizadas
Entre las nuevas APIs estables están Vec::from_fn, Box::take y Box::map, Rc::map y Arc::map, str::trim_prefix y str::trim_suffix (también para slices y Path::trim_prefix), bool::toggle, impl Default for Once, métodos nuevos de UnsafeCell y, en Windows, CommandExt::show_window y Child::main_thread_handle.
Para actualizar basta con ejecutar rustup update stable. Si quieres ver hacia dónde va el lenguaje en el ecosistema, tienes en programacion.net por qué medio ecosistema de software se está pasando a Rust y los traits de Rust que de verdad vas a usar todos los días.
Fuente: Rust 1.100.0 (blog oficial de Rust).
Imagen: Pexels / Optical Chemist
