Rust 1.70
lun, 05/06/2023 - 15:39
L'équipe Rust a annoncé la disponbilité de Rust 1.70. Tout d'abord cette version vient avec le protocole sparse activé par défaut, après sa stabilisation avec Rust 1.68. Jusqu'ici c'est le protocole Git qui était activé par défaut. Celui-ci clone un référentiel qui indexe toutes les caisses disponibles dans le registre, mais cette approche a présenté des limites de mise à l'échelle, avec des retards notables lors de la mise à jour des référentiels, souligne l'équipe de Rust. Le nouveau protocole devrait apporter une amélioration significative des performances lors de l'accès à crates.io, car il ne téléchargera que des informations sur le sous-ensemble de caisses que vous utilisez réellement.
OnceCell et OnceLock
Avec Rust 1.70, Deux nouveaux types ont été stabilisés pour l'initialisation unique des données partagées, OnceCell et son équivalent thread-safe OnceLock. Ceux-ci peuvent être utilisés partout où la construction immédiate n'est pas souhaitée, et peut-être même pas possible comme les données non-const dans les variables globales.
use std::sync::OnceLock;
static WINNER: OnceLock<&str> = OnceLock::new();
fn main() {
let winner = std::thread::scope(|s| {
s.spawn(|| WINNER.set("thread"));
std::thread::yield_now(); // give them a chance...
WINNER.get_or_init(|| "main")
});
println!("{winner} wins!");
}
Des caisses telles que lazy_static et once_cell ont répondu à ce besoin par le passé, mais maintenant ces blocs de construction font partie de la bibliothèque standard.
Nouvelle méthode IsTerminal
La nouvelle méthode IsTerminal permet de déterminer si un descripteur de fichier ou un descripteur donné représente un terminal ou un TTY. Il s'agit d'un autre cas de standardisation de fonctionnalités qui existaient dans les crates externes, comme atty et is-terminal, en utilisant la fonction de la bibliothèque C isatty sur les cibles Unix et des fonctionnalités similaires ailleurs. Un cas d'utilisation courant consiste pour les programmes à faire la distinction entre l'exécution dans des scripts ou des modes interactifs.
use std::io::{stdout, IsTerminal};
fn main() {
let use_color = stdout().is_terminal();
// if so, add color codes to program output...
}