El equipo de Rust se complace en anunciar el lanzamiento de una nueva versi贸n, 1.40.0. Rust es un lenguaje de programaci贸n que permite a todos crear software confiable y eficiente.
Si instal贸 la versi贸n anterior de Rust utilizando rustup
, para actualizar a la versi贸n 1.40.0 solo necesita ejecutar el siguiente comando:
$ rustup update stable
Si a煤n no ha instalado rustup
, puede instalarlo desde la p谩gina correspondiente de nuestro sitio web, as铆 como ver las notas de lanzamiento detalladas en GitHub.
Lo que se incluye en la versi贸n estable 1.40.0
Las principales innovaciones son la introducci贸n del atributo #[non_exhaustive]
, mejoras a las macros!()
Y #[attribute]
. Finalmente, las advertencias del analizador de migraci贸n del prestatario se convirtieron en errores en Rust 2015. Consulte las notas de la versi贸n para obtener m谩s informaci贸n.
#[non_exhaustive]
estructuras #[non_exhaustive]
, enumeraciones y opciones de enumeraci贸n
Supongamos que usted es el autor de una biblioteca alpha
que contiene pub struct Foo
. Desea hacer p煤blicos los campos de la estructura alpha::Foo
, pero no est谩 seguro de si tendr谩 que agregar m谩s campos a Foo
en futuras versiones. Existe un dilema: o hace que los campos sean privados con inconvenientes posteriores, o corre el riesgo de hacer que los usuarios dependan de los campos y luego viola su c贸digo al agregar nuevos. Rust 1.40.0 introduce una forma de resolver el problema con #[non_exhaustive]
.
El atributo #[non_exhaustive]
adjunta a la estructura o variante de la enumeraci贸n y evita la comparaci贸n completa de los campos, la creaci贸n de dicha estructura o variante fuera de la caja con su declaraci贸n. El siguiente ejemplo muestra errores en la caja beta
dependiente de alfa:
驴Qu茅 est谩 pasando detr谩s de escena? La visibilidad de los constructores para la estructura #[non_exhaustive]
o la opci贸n de enumeraci贸n se reducir谩 a pub(crate)
, prohibiendo as铆 su uso en cajas de terceros.
Quiz谩s un aspecto m谩s importante de #[non_exhaustive]
es que un atributo se puede adjuntar a las enumeraciones en s铆. Aqu铆 est谩 el c贸digo tomado de std::cmp::Ordering
:
#[non_exhaustive] pub enum Ordering { Relaxed, Release, Acquire, AcqRel, SeqCst }
En este caso, #[non_exhaustive]
garantiza la posibilidad de agregar nuevas opciones en el futuro. Esto se logra al prohibir que otros paquetes utilicen una concordancia exhaustiva de im谩genes para realizar Ordering
. El compilador rechazar铆a lo siguiente:
match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { }
En cambio, otros paquetes ahora deber铆an considerar la posibilidad de nuevas opciones de enumeraci贸n, por ejemplo, agregando el comod铆n _
:
match ordering { Relaxed | Release | Acquire | AcqRel | SeqCst => { } _ => { }
Los detalles sobre el atributo #[non_exhaustive]
disponibles en el informe de estabilizaci贸n .
Mejoras de macro y atributos
En 1.40.0, realizamos varias mejoras en macros y atributos, que incluyen:
mac!()
en contextos tipo.
Por ejemplo, puede escribir el type Foo = expand_to_type!(bar);
donde expand_to_type
ser谩 una macro de procedimiento.
extern { ... }
bloques extern { ... }
.
Este bloque incluye las make_item!()
. Por ejemplo:
macro_rules! make_item { ($name:ident) => { fn $name(); } } extern { make_item!(alpha); make_item!(beta); }
Las macros de procedimiento de atributos para elementos en bloques extern { ... }
ahora tambi茅n son compatibles:
extern "C" { #[my_identity_macro]
macro_rules!
elementos en macros de procedimiento.
隆Las macros con sintaxis de funci贸n ( mac!()
) Y atributos ( #[mac]
) ahora pueden generar macro_rules!
. Vea el informe de estabilizaci贸n adjunto para m谩s detalles.
TokenStream
$m:meta
admite TokenStream
.
Es decir, el siguiente c贸digo es correcto:
macro_rules! accept_meta { ($m:meta) => {} } accept_meta!( my::path ); accept_meta!( my::path = "lit" ); accept_meta!( my::path ( abc ) ); accept_meta!( my::path [ abc ] ); accept_meta!( my::path { abc } );
Las advertencias de migraci贸n del analizador del prestatario se convierten en errores en la edici贸n Rust 2015
En la versi贸n 1.35.0, informamos que NLL
apareci贸 en la edici贸n Rust 2015 despu茅s de la primera versi贸n para la edici贸n 2018 en Rust 1.31 .
Como dijimos, el antiguo analizador de pr茅stamos podr铆a permitir una gesti贸n de memoria insegura, y con el nuevo analizador (verificador de pr茅stamos NLL) se resolvieron estas deficiencias. Dado que estos errores podr铆an alterar el c贸digo estable, decidimos introducir gradualmente estos errores, verificando si el analizador anterior permitir谩 el ensamblaje del programa y si el nuevo lo bloquear谩. En estos casos, los errores fueron reemplazados por advertencias.
La versi贸n anterior de Rust 1.39.0 reemplaz贸 estas advertencias con errores de c贸digo con la edici贸n 2018 . Rust 1.40.0 aplicar谩 los mismos cambios al c贸digo de la edici贸n 2015 , cerrando permanentemente estos agujeros de seguridad. 隆Junto con esto, el compilador incluso se limpi贸 del c贸digo anterior !
Si su proyecto no se debe a los cambios anteriores, o si desea saber m谩s, lea la publicaci贸n de Niko Matsakis .
Funciones m谩s constantes en la biblioteca est谩ndar.
Comenzando con Rust 1.40.0, la siguiente funci贸n se marca como constante ( const fn
):
Funciones estables en la biblioteca est谩ndar.
Las siguientes funciones y macros se estabilizaron en Rust 1.40.0:
todo!()
隆Una versi贸n m谩s corta, m谩s memorable y m谩s conveniente de la macro unimplemented!()
.
slice::repeat
Crea una Vec<T>
partir de n
repeticiones de corte.
mem::take
Esta funci贸n toma los valores del enlace mutable y los reemplaza con el valor predeterminado para este tipo. Es similar a Option::take
y Cell::take
y es una abreviatura conveniente para mem::replace(&mut dst, Default::default())
.
BTreeMap::get_key_value
y HashMap::get_key_value
Devuelve un par clave-valor que coincide con la clave proporcionada.
Option::as_deref
, Option::as_deref_mut
Funcionan de manera similar a Option::as_ref
y Option::as_mut
, pero usan Deref
y DerefMut
respectivamente, as铆 que opt_box.as_deref()
y opt_box.as_deref_mut()
, donde opt_box: Option<Box<T>>
crea Option<&T>
y Option<&mut T>
respectivamente.
Option::flatten
Esta funci贸n, como Iterator::flatten
, expande la Option<Option<T>>
a la Option<T>
, produciendo Some(x)
para Some(Some(x))
y None
contrario.
UdpSocket::peer_addr
Devuelve la direcci贸n del host remoto al que est谩 conectado el socket.
{f32,f64}::to_be_bytes
, {f32,f64}::to_le_bytes
, {f32,f64}::to_ne_bytes
, {f32,f64}::from_be_bytes
, {f32,f64}::from_le_bytes
y {f32,f64}::from_ne_bytes
Devuelve una representaci贸n de memoria de n煤meros de coma flotante como una matriz de bytes con orden de bytes big-endian (red), little-endian o nativo-endian.
Otros cambios
La sintaxis , el administrador de paquetes de carga y el analizador Clippy tambi茅n han sufrido algunos cambios.
Lea las notas de compatibilidad para ver si estos cambios le afectan.
Miembros 1.40.0
Mucha gente se uni贸 para crear Rust 1.40.0. No podr铆amos haber hecho esto sin todos ustedes, 隆 gracias !
De traductores
Con cualquier pregunta sobre el idioma Rust, podr谩n ayudarlo en el chat de Telegram en ruso o en un chat similar para los reci茅n llegados .
Este art铆culo fue traducido conjuntamente por andreevlex , blandger , funkill , Hippolot , P0lunin , PsyHaSTe y LooMaclin .