Lanzamiento de Rust 1.39.0: asíncrono / espera, atributos para parámetros de función, nuevas funciones constantes

El equipo de Rust se complace en anunciar el lanzamiento de una nueva versión, 1.39.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 usando rustup , para actualizar a la versión 1.39.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.39.0


Las innovaciones más significativas incluyen la .await async / .await , referencias compartidas a valores móviles en match-guards y los atributos de los parámetros de función. Consulte las notas detalladas de la versión para obtener más información.


Con .await terminado, conoce a async fn


Anteriormente en Rust 1.36.0, anunciamos la disponibilidad del rasgo Future . Entonces notamos que:


Esperamos que esta innovación permita que las cajas populares, las bibliotecas y todo el ecosistema se preparen para la .await async / .await , que se planea estabilizar en el futuro cercano.

La promesa se da, la promesa se cumple. Nos complace anunciar que la .await async / .await tan esperada, que nos permite definir funciones y bloques async ( async ) y esperar su ejecución ( .await ), ¡finalmente es estable!


Una función asincrónica definida usando la sintaxis async fn (en lugar de la fn habitual) no hace nada excepto que cuando se llama, devuelve un objeto que implementa el rasgo Future . Este objeto es un cálculo suspendido, que se puede completar con la sintaxis .await . Además, async fn , async { ... } y async move { ... } actúan como cierres y pueden usarse para definir literales asíncronos.


Puede leer más sobre el lanzamiento de async / .await en la publicación del blog Niko Matsakis .


Enlaces compartidos a valores de itinerancia en match-guards


Al hacer coincidir una imagen, una variable conocida como enlace se puede vincular de una de las siguientes maneras:


  • Por referencia, inmutable o mutable. Esto se puede hacer explícitamente, por ejemplo, con la sintaxis ref my_var o ref mut my_var respectivamente. Casi siempre, el modo de captura se mostrará automáticamente.


  • Por valor: ya sea copiando (si el tipo de la variable enlazada implementa el rasgo Copy ) o transfiriéndolo a la propiedad .



Ahora está permitido usar variables de plantilla en las restricciones if de la plantilla, si la propiedad se transfiere a esta variable (es decir, la variable en la plantilla de enlaces por movimiento). Anteriormente, se descartaría el siguiente código:


 fn main() { let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]); match array { nums // ---- `nums`    (by move). if nums.iter().sum::<u8>() == 10 // ^------ `.iter()`     `nums` => { drop(nums); // ----------- `nums`      } _ => unreachable!(), } } 

A partir de Rust 1.39.0 , el compilador aceptará el fragmento anterior sin advertencias ni errores. Esperamos que esta innovación aumente la usabilidad de la expresión de match .


Atributos para parámetros de función


A partir de Rust 1.39.0, los atributos se pueden aplicar a parámetros de función, cierres y punteros de función. Anteriormente, la función len() podía representarse de la siguiente manera:


 #[cfg(windows)] fn len(slice: &[u16]) -> usize { slice.len() } #[cfg(not(windows))] fn len(slice: &[u8]) -> usize { slice.len() } 

Pero Rust 1.39.0 hace que escribir el código anterior sea mucho más simple:


 fn len( #[cfg(windows)] slice: &[u16], //        Windows. #[cfg(not(windows))] slice: &[u8], //       . ) -> usize { slice.len() } 

Los atributos utilizables incluyen:


  1. Compilación condicional: cfg y cfg_attr ;


  2. Gestión de cheques: allow , warn , deny y forbid ;


  3. Atributos auxiliares utilizados por macros de atributos de procedimiento para elementos de sintaxis.


    Esperamos que esta innovación ayude al ecosistema a escribir DSL basadas en macro más expresivas.



Las advertencias de migración de cheques de préstamo se convierten en errores graves en Rust 2018


En la versión 1.35.0, anunciamos que el nuevo analizador de préstamos (NLL) llegó a los editores de Rust 2015 después de que se lanzó a los editores de Rust 2018 en la versión 1.31 .


Como se indicó en la versión 1.35.0, el analizador de préstamos anterior fue diseñado con errores que permitían el uso inseguro de la memoria. Estos errores se corrigieron utilizando un nuevo analizador que implementa NLL. Dado que estas correcciones podrían romper el código de trabajo, el equipo de Rust decidió introducirlas gradualmente, verificando que el analizador anterior debería aceptar el código, que el nuevo analizador rechazaría. Si es así, los errores se convertirán en advertencias.


A partir de Rust 1.39.0, estas advertencias ahora son errores en la edición Rust 2018 .
En la próxima versión de Rust 1.40.0, esta regla también se aplicará al código de revisión de Rust 2015 , que eliminará por completo el antiguo analizador de préstamos del compilador.


Si se ve afectado por estos cambios, o desea saber más, consulte la publicación del blog Niko Matsakis .


Funciones más constantes en la biblioteca estándar.


A partir de Rust 1.39.0, las siguientes funciones están marcadas como const fn ( const fn ):



Funciones estables en la biblioteca estándar.


Las siguientes funciones se han estabilizado en Rust 1.39.0:



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.39.0


Mucha gente se unió para crear Rust 1.39.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 e Hippolot .

Source: https://habr.com/ru/post/474808/


All Articles