Lanzamiento de Rust 1.31 y Rust 2018

El equipo de desarrollo de Rust se complace en anunciar el lanzamiento de una nueva versión de Rust, 1.31.0, así como "Rust 2018". Rust es un lenguaje de programación que permite a todos crear software confiable y eficiente.


Si tiene una versión anterior de Rust instalada con rustup , entonces para actualizar Rust a la versión 1.31.0 solo necesita hacer:


 $ rustup update stable 

Si aún no ha instalado rustup , puede instalarlo desde la página correspondiente de nuestro sitio web. Las notas de lanzamiento detalladas para Rust 1.31.0 están disponibles en GitHub.


Lo que se incluye en la versión estable 1.31.0


¡Rust 1.31 es posiblemente la versión más significativa desde Rust 1.0! La primera versión de "Rust 2018" se incluye en esta versión, ¡pero esta no es la única innovación! La revisión de las mejoras será larga, así que aquí está la tabla de contenido:


  • Rust 2018
    • Tiempos de vida no léxicos
    • Modificaciones del sistema de módulos
  • Reglas adicionales para mostrar vidas
  • const fn
  • Nuevas herramientas
  • Verificaciones de calidad del código instrumental
  • La documentación
  • Grupos de trabajo temáticos
  • Nuevo sitio web
  • Estabilización de la biblioteca estándar.
  • Mejoras de carga
  • Desarrolladores de lanzamiento

Rust 2018


Escribimos sobre Rust 2018 por primera vez en marzo y luego en julio . Para obtener detalles sobre por qué necesita Rust 2018, consulte estas publicaciones. En esta revisión, hay mucho que contarnos, por lo que nos centraremos solo en lo que es Rust 2018. También puede leer sobre esto en una publicación sobre Mozilla Hacks ( traducción ).


En resumen, Rust 2018 es una oportunidad para integrar todo el trabajo que hemos realizado en los últimos tres años en un todo coherente. Rust 2018 es más que solo un montón de mejoras de idioma. Además de ellos, incluye:


  • Kit de herramientas (soporte en IDE, rustfmt , Clippy)
  • La documentación
  • Grupos de trabajo sujetos
  • Nuevo sitio web

Además, hablaremos sobre todo esto con más detalle y sobre otras innovaciones.


Creemos un nuevo proyecto usando Cargo:


 $ cargo new foo 

Aquí está el contenido de Cargo.toml :


 [package] name = "foo" version = "0.1.0" authors = ["Your Name <you@example.com>"] edition = "2018" [dependencies] 

Se ha agregado una nueva clave a la sección [package] : edition . Tenga en cuenta que se instaló en 2018 . También puede instalarlo en 2015 : este valor se establecerá de forma predeterminada si falta la clave.


El uso de Rust 2018 desbloqueará algunas características nuevas que no están permitidas en Rust 2015.


Es importante tener en cuenta que cada paquete puede estar en modo 2015 o 2018, y funcionarán juntos. Su proyecto de la edición 2018 puede usar las dependencias de la edición 2015, y el proyecto de la edición 2015 puede usar las dependencias de la edición 2018. Esto garantiza la integridad del ecosistema y que todas las nuevas características serán opcionales, mientras se mantiene la compatibilidad con el código existente. Además, cuando decide transferir el código Rust 2015 a Rust 2018, los cambios se pueden realizar automáticamente a través de cargo fix .


Usted puede preguntar: ¿qué pasa con las nuevas características en sí? En primer lugar, también se agregan en Rust 2015, si son compatibles con las características de esta edición. Por lo tanto, la mayor parte del lenguaje sigue siendo el mismo en todas partes. Puede consultar el manual editorial para conocer la versión mínima de rustc para cada nueva característica y sus otros requisitos. Sin embargo, hay varias grandes innovaciones que deben mencionarse por separado: vidas no léxicas y algunos cambios en el sistema de módulos.


Tiempos de vida no léxicos


Si ha seguido a Rust durante los últimos años, ocasionalmente puede encontrar el término "NLL" o "vidas no léxicas". Esta es la jerga, que, en términos simples, significa: el prestatario se ha vuelto más inteligente y ahora acepta algún código correcto, que rechazó antes. Considere un ejemplo:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; } 

Rust solía arrojar un error de compilación:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | 6 | let z = &mut x; | ^ mutable borrow occurs here 7 | } | - immutable borrow ends here 

Esto se debe a que el área de vida de los enlaces se definió "léxicamente"; es decir, tomar prestado y se consideró activo hasta que salió del alcance al final de main , incluso si nunca volvemos a usar y dentro del alcance. Todo está bien con el código anterior, pero el analizador de dependencias no pudo entender esto.


Ahora este código se compila bien.


Pero, ¿y si usáramos y ? Por ejemplo, así:


 fn main() { let mut x = 5; let y = &x; let z = &mut x; println!("y: {}", y); } 

Rust solía darte este error:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:18 | 4 | let y = &x; | - immutable borrow occurs here 5 | let z = &mut x; | ^ mutable borrow occurs here ... 8 | } | - immutable borrow ends here 

En Rust 2018, este mensaje de error mejoró:


 error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> src/main.rs:5:13 | 4 | let y = &x; | -- immutable borrow occurs here 5 | let z = &mut x; | ^^^^^^ mutable borrow occurs here 6 | 7 | println!("y: {}", y); | - borrow later used here 

En lugar de indicar dónde y fuera del alcance, muestra dónde se producen préstamos contradictorios. Esto simplifica enormemente los errores de depuración de este tipo.


En Rust 1.31, esta es una mejora exclusiva para Rust 2018. Planeamos agregarlo a Rust 2015 más adelante.


Modificaciones del sistema de módulos


El sistema de módulos puede ser difícil para las personas que están aprendiendo Rust por primera vez. Por supuesto, siempre hay algo que lleva tiempo dominar. Pero la razón principal por la que los módulos son tan vergonzosos para muchos es que a pesar de las reglas simples y consistentes que definen el sistema de módulos, las consecuencias de su uso pueden parecer contradictorias, misteriosas y poco naturales.


Por lo tanto, la edición 2018 realiza algunos cambios en la forma en que funcionan las rutas, simplificando el sistema de módulos y haciéndolo más comprensible.


Aquí hay un breve resumen:


  • extern crate ya no es necesaria en casi ningún otro lugar.
  • Puede importar macros usando use , en lugar de usar el atributo #[macro_use] .
  • Las rutas absolutas comienzan con el nombre del contenedor, donde la palabra clave crate refiere al contenedor actual.
  • foo.rs y el subdirectorio foo/ pueden coexistir; mod.rs no es necesario al colocar submódulos en un subdirectorio.

Parece un conjunto arbitrario de reglas, pero en general, el modelo mental ahora se ha simplificado enormemente.


Todavía hay muchos detalles, consulte el manual editorial para obtener todos los detalles.


Reglas adicionales para mostrar vidas


Hablemos de la mejora disponible en ambas ediciones: hemos agregado algunas reglas de inferencia adicionales para bloques impl y definiciones de funciones. Código como este:


 impl<'a> Reader for BufReader<'a> { //   } 

ahora se puede escribir así:


 impl Reader for BufReader<'_> { //   } 

Lifetime '_ todavía muestra que BufReader toma como parámetro, pero ya no necesitamos darle un nombre.


Las vidas todavía deben definirse en estructuras. Sin embargo, ya no necesitamos escribir tanto código repetitivo como antes:


 // Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // Rust 2018 struct Ref<'a, T> { field: &'a T } 

Dependencia : 'a generará. Todavía puede especificarlo explícitamente si lo desea. Estamos considerando otras oportunidades de retiro en dichos lugares para el futuro, pero hasta ahora no tenemos planes concretos.


const fn


Rust tiene varias formas de declarar una función: fn para funciones ordinarias, unsafe fn inseguro para funciones inseguras y extern fn para funciones externas. Esta versión agrega una nueva forma de declarar una función: const fn . Se usa así:


 const fn foo(x: i32) -> i32 { x + 1 } 

Una función constante se puede llamar como una función normal, pero además se puede usar en cualquier contexto constante. Sin embargo, se ejecutará en tiempo de compilación y no durante la ejecución del programa. Por ejemplo:


 const SIX: i32 = foo(5); 

La función foo se ejecutará en tiempo de compilación y SIX se establecerá en 6 .


Las funciones constantes no pueden hacer todo lo que las funciones normales pueden hacer: deben tener un resultado determinista. Esto es importante por razones de fiabilidad. En la forma actual, las funciones constantes pueden realizar un subconjunto mínimo de operaciones. Estos son algunos ejemplos de lo que puede hacer en ellos:


  • Usar operaciones aritméticas y de comparación de enteros
  • Utilice cualquier operación lógica excepto && y ||
  • Diseñar matrices, estructuras, enumeraciones y tuplas.
  • Llama a otras funciones constantes
  • Acceso por índice en matrices y sectores.
  • Accediendo a los campos de estructuras y tuplas
  • Use constantes (pero no valores estáticos, ni siquiera referencias a ellos)
  • Utilice los enlaces & y *
  • Tipos de conversión, excepto puntero sin formato de conversión al valor entero

Ampliaremos las capacidades de las funciones constantes, pero el conjunto anterior ya es suficiente para usar const fn en la práctica.


Consulte el manual para más detalles.


Nuevas herramientas


La edición 2018 marca el comienzo de un nuevo nivel de madurez para el ecosistema de herramientas Rust. Cargo, Rustdoc y Rustup han sido las herramientas principales desde la versión 1.0; Con la edición 2018, está llegando una nueva generación de herramientas que todos pueden usar ahora: Clippy, Rustfmt e IDE.


El analizador de código estático clippy ahora está disponible en Rust estable. Puede instalarlo a través del rustup component add clippy y ejecutarlo con el cargo clippy . Clippy ha recibido la versión 1.0 y tiene las mismas garantías de estabilidad para las comprobaciones estáticas que rustc. Se pueden agregar nuevas comprobaciones o se puede ampliar la funcionalidad de las anteriores, pero las anteriores no se pueden eliminar (solo se pueden marcar como obsoletas). Esto significa que el código que se compila con clippy continuará compilándose con clippy (suponiendo que no se establezcan comprobaciones para generar
error a través de deny ), pero puede generar nuevas advertencias.


Rustfmt es una herramienta para formatear código en Rust. El formateo automático del código le ahorrará tiempo, además, acercará su código al estilo oficial de Rust . Puede instalarlo a través del rustup component add rustfmt y use el comando cargo fmt .


La versión actual incluye Rustfmt 1.0. A partir de ahora, garantizamos la compatibilidad con versiones anteriores de Rustfmt: si formatea su código hoy, el formato no cambiará en el futuro (solo para los parámetros predeterminados). La compatibilidad con versiones anteriores significa que ahora es práctico ejecutar Rustfmt en su CI (use cargo fmt --check ). Pruebe esto junto con "formatear al guardar" en el editor, y su flujo de trabajo se revolucionará.


El soporte IDE es una de las características más solicitadas para Rust. Ahora hay varias soluciones de alta calidad:



El trabajo de soporte en el IDE no está terminado. En particular, la finalización del código en editores basados ​​en RLS no está a la altura. Sin embargo, si desea principalmente soporte para tipos, documentación y la "transición a la definición", entonces estará satisfecho.


Comprobaciones de calidad de código instrumental (herramientas)


En Rust 1.30, estabilizamos "atributos instrumentales" como #[rustfmt::skip] . En Rust 1.31, estabilizamos algo como esto: "herramienta hilachas" como #[allow(clippy::bool_comparison)] . Esto le permite especificar espacios de nombres para las comprobaciones para aclarar de qué herramientas provienen.


Si anteriormente ha utilizado las comprobaciones de Clippy, puede migrar de la siguiente manera:


 //  #![cfg_attr(feature = "cargo-clippy", allow(bool_comparison))] //  #![allow(clippy::bool_comparison)] 

¡Ya no necesitas cfg_attr ! Ahora también recibirá advertencias que lo ayudarán a cambiar al uso del nuevo estilo.


La documentación


Hubo varias mejoras en Rustdoc este año, y se lanzó el libro completamente reescrito, The Rust Programming Language. ¡Puedes comprar una copia en papel de No Starch Press !


Anteriormente se llamaba la "segunda edición" del libro, pero desde que se convirtió en la primera edición impresa, esto causó confusión. Después de todo, se planea actualizar periódicamente la edición impresa. Al final, después de muchas discusiones con No Starch, se decidió actualizar el libro en el sitio web con cada lanzamiento, y No Starch periódicamente recogería los cambios y los imprimiría. El libro se vende bastante bien y recauda dinero para Black Girls Code .


Puedes encontrar la nueva versión del libro aquí .


Grupos de trabajo temáticos


Este año anunciamos la creación de cuatro grupos de trabajo:


  • Servicios de red
  • Aplicaciones de línea de comando
  • Montaje web
  • Dispositivos integrados

Los grupos trabajaron muy duro para mejorar Rust en cada una de estas áreas. Aquí hay algunos logros:


  • Los servicios de red rediseñaron la interfaz para futuros y, además, asíncrono / espera. Estas mejoras aún no se han lanzado, ¡pero ya estamos cerca!
  • El equipo de CLI trabajó en bibliotecas y documentación para mejorar las aplicaciones de línea de comandos.
  • WebAssembly ha lanzado muchas herramientas de clase mundial para usar Rust con wasm.
  • Para dispositivos integrados, se hizo posible desarrollar ARM en un Rust estable.

¡Puede obtener más información sobre todo esto en nuestro nuevo sitio!


Nuevo sitio web


La semana pasada anunciamos una nueva versión de nuestro sitio web. ¡Ahora se ha convertido en la versión oficial de rust-lang.org!


Para crearlo tomó un año de trabajo de muchas personas. Aunque todavía queda mucho por hacer antes de su finalización, estamos orgullosos del trabajo realizado.


Estabilización de la biblioteca estándar.


Se han agregado nuevas implementaciones de From :


  • u8 ahora implementa From<NonZeroU8> , de manera similar para otros tipos numéricos y sus equivalentes no NonZero
  • Option<&T> implementa From<&Option<T>> , de manera similar a &mut

Las siguientes funciones también se han estabilizado:



Vea las notas de la versión para más detalles.


Mejoras de carga


Cargo ahora cargará paquetes en paralelo usando HTTP / 2.


Además, dado que la extern crate ahora extern crate opcional, sería frustrante escribir una extern crate foo as bar; cambiar el nombre de la dependencia. Por lo tanto, puede hacerlo en Cargo.toml esta manera:


 [dependencies] baz = { version = "0.1", package = "foo" } 

o, equivalentemente:


 [dependencies.baz] version = "0.1" package = "foo" 

El paquete foo ahora está disponible como baz para usar en su código.


Vea las notas de la versión para más detalles.


Desarrolladores 1.31.0


Por lo general, al final de la revisión, agradecemos a las personas que contribuyeron al lanzamiento . Pero esta vez, a diferencia del pasado, esta lista no cubre completamente a todas las personas que ayudaron, y toda la cantidad de trabajo que se ha realizado. Cada lanzamiento regular es el resultado de seis semanas de trabajo, pero este lanzamiento es la culminación de tres años de esfuerzo, reflejado en la gran cantidad de repositorios realizados por una gran cantidad de personas. Nos complació trabajar con todos ustedes y esperamos con ansias el desarrollo continuo de Rust durante los próximos tres años.


De un traductor: Expreso un agradecimiento especial a los miembros de la comunidad Rustycrate y personalmente a @dashadee , ozkriff , humbug y mvlabat por su ayuda con la traducción y la corrección de pruebas.

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


All Articles