Versi贸n Rust 1.40.0: # [no_exhaustivo], mejoras de macro y otras mejoras

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:


 // alpha/lib.rs: #[non_exhaustive] struct Foo { pub a: bool, } enum Bar { #[non_exhaustive] Variant { b: u8 } } fn make_foo() -> Foo { ... } fn make_bar() -> Bar { ... } // beta/lib.rs: let x = Foo { a: true }; //~  let Foo { a } = make_foo(); //~  let Foo { a, .. } = make_foo(); //~ OK // -- `beta`       . let x = Bar::Variant { a: 42 }; //~  let Bar::Variant { b } = make_bar(); //~  let Bar::Variant { b, .. } = make_bar(); //~ OK // -- `beta`    ... 

驴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 => { /* logic */ } //~^ ;      , //   ,        . } 

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 => { /* logic */ } _ => { /* logic */ } // OK;     ,   . } 

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] //~  ,     `fn foo();`. fn foo(); } 

  • 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:



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 .

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


All Articles