Rust 1.59

Par:
fredericmazue

ven, 25/02/2022 - 12:15

Mozilla vient de publier une nouvelle version de son langage maison : Rust 1.59. Voici quelques-unes des nouveautés apportées par cette mouture.

Code assembleur en ligne

Avec Rust 1.59, il est possible d'écrire du code assembleur en ligne. Cela permet, indique Mozilla, à de nombreuses applications qui ont besoin d'un contrôle de très bas niveau sur leur exécution ou d'accéder à des instructions machine spécialisées. Lors de la compilation pour des cibles x86-64, par exemple, vous pouvez désormais écrire :

use std::arch::asm;

// Multiply x by 6 using shifts and adds
let mut x: u64 = 4;
unsafe {
    asm!(
        "mov {tmp}, {x}",
        "shl {tmp}, 1",
        "shl {x}, 2",
        "add {x}, {tmp}",
        x = inout(reg) x,
        tmp = out(reg) _,
    );
}
assert_eq!(x, 4 * 6);

La syntaxe de la chaîne de format utilisée pour nommer les registres dans les macros asm! et global_asm! est la même que celle utilisée dans les chaînes de format.

Affectation avec déstructuration

Vous pouvez désormais utiliser des modèles de tuple, de tranche et de structure comme côté gauche d'une affectation.

let (a, b, c, d, e);

(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };

assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);

Valeurs par défaut pour les génériques const

Les types génériques peuvent désormais spécifier des valeurs par défaut pour leurs arguments génériques const. Par exemple, vous pouvez maintenant écrire

struct ArrayStorage<T, const N: usize = 2> {
    arr: [T; N],
}

impl<T> ArrayStorage<T> {
    fn new(a: T, b: T) -> ArrayStorage<T> {
        ArrayStorage {
            arr: [a, b],
        }
    }
}

Rust 1.59 désactive la compilation incrémentale par défaut

A remarquer : Rust 1.59 désactive l'incrémentation par défaut (sauf si explicitement demandé par via une variable d'environnement : RUSTC_FORCE_INCREMENTAL=1). Ceci afin d'atténuer les effets d'un bogue connu, #94124 , qui peut provoquer des erreurs de désérialisation (et des paniques) lors de la compilation avec la compilation incrémentielle activée. Le correctif pour #94124 existe et est actuellement dans la version bêta 1.60.