El equipo de desarrollo de Rust se complace en anunciar el lanzamiento de una nueva versión, 1.38.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.38.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.
¿Qué se incluye en la versión estable?
Lo más destacado de esta versión es la compilación canalizada.
Recopilación de tuberías
El compilador no necesita dependencias completamente ensambladas para compilar el paquete, sino solo sus "metadatos" (una lista de tipos, dependencias, exportaciones, etc.) generados en una etapa temprana de compilación. A partir de Rust 1.38.0, Cargo comenzará a construir paquetes dependientes tan pronto como sus metadatos estén disponibles.
El tiempo de compilación de un paquete no disminuyó, pero nuestras pruebas mostraron que la velocidad de compilación aumenta en un 10% -20% en el caso de compilaciones optimizadas (donde algunas dependencias ya están compiladas). Para otros paquetes, no ocurrió un fuerte aumento en la velocidad de compilación. El tiempo que lleva construir el paquete depende de la computadora, por lo que el rendimiento puede variar. La compilación de canalización se habilita automáticamente desde la versión 1.38.0.
Comprobando algún mal uso de mem::{uninitialized, zeroed}
Como se anunció anteriormente , std::mem::uninitialized
recomienda std::mem::uninitialized
. En su lugar, MaybeUninit<T>
vez se debería usar MaybeUninit<T>
.
La función mem::uninitialized
aún no está en desuso, pero esto se hará en futuras versiones. Pero a pesar de esto, a partir de 1.38.0, rustc
busca una clase estrecha de inicializaciones incorrectas usando mem::uninitialized
o mem::zeroed
.
Para algunos tipos, como &T
y Box<T>
, un valor nulo se considera comportamiento indefinido, ya que son objetos tipo puntero que no deberían ser null
. Será un error usar mem::uninitialized
o mem::zeroed
para inicializar estos tipos, por lo que el compilador intentará advertirle si alguna de estas funciones se usa para inicializar los objetos anteriores, y no importa si se inicializan directamente o como Campos de gran estructura. Esta comprobación es recursiva, por lo que el siguiente código conlleva una advertencia:
struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() };
Los lectores atentos pueden notar que la biblioteca estándar contiene más tipos que no deberían llenarse con ceros, especialmente NonNull<T>
y NonZero<T>
. Hasta ahora, no se ha verificado la inicialización de estas estructuras con mem::uninitialized
o mem::zeroed
.
Estas comprobaciones no cubren todos los casos de uso incorrecto de mem::uninitialized
o mem::zeroed
, pero le permiten detectar un código incorrecto garantizado que debería cambiar a MaybeUninit
.
#[deprecated]
para macros
El atributo #[deprecated]
, introducido por primera vez en Rust 1.9.0, permite a los autores de paquetes notificar a los usuarios sobre la funcionalidad obsoleta que planean eliminar en futuras versiones. Rust 1.38.0 le permite aplicar este atributo a las macros.
std::any::type_name
Puede ser necesaria una representación de cadena del tipo utilizado al depurar código. Por ejemplo, en el cuerpo de una función genérica, es posible que desee imprimir el tipo de argumento pasado. Ahora esto es std::any::type_name
con std::any::type_name
:
fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); }
Resultado:
Initializing an instance of i32 Initializing an instance of alloc::string::String
Al igual que todas las funciones de la biblioteca estándar, destinadas únicamente a la depuración, esta función no garantiza el contenido exacto y el formato de la cadena. El valor de retorno es la mejor descripción del tipo; múltiples tipos pueden estar representados por el mismo type_name
, pero puede cambiar en futuras versiones del compilador.
Cambios en la biblioteca estándar
Además, algunas funciones se han estabilizado:
Otros cambios
La sintaxis , el administrador de paquetes de carga y el analizador Clippy también han sufrido algunos cambios.
Miembros 1.38.0
Mucha gente se unió para crear Rust 1.38.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 , nlinker , funkill y Gymmasssorla .