Comment fonctionnent les consts globales qui ne sont pas copiées ou clonées dans Rust?

20

Dis que j'ai l'extrait de code suivant ( aire de jeux )

struct A {
    pub val: u32
}

const GLOBAL_A: A = A {val: 2};

fn main() {
    let some_a: A = GLOBAL_A;
    let other_a: A = GLOBAL_A;

    println!("double val = {}", some_a.val + other_a.val);
}

Puisque An'est ni Cloneni Copy, je suppose que la valeur de GLOBAL_Aserait déplacée. Cela n'a pas beaucoup de sens pour un const et comme illustré ne peut pas être le cas de toute façon car il peut être "déplacé" deux fois.

Quelles sont les règles qui permettent l'extrait ci - dessus au travail considérant An'est pas Cloneni Copy?

RecursiveExceptionException
la source

Réponses:

21

Les constantes sont toujours alignées. Votre exemple est essentiellement le même que

struct A {
    pub val: u32
}

fn main() {
    let some_a: A = A {val: 2};
    let other_a: A = A {val: 2};

    println!("double val = {}", some_a.val + other_a.val);
}

La valeur est reconstruite deux fois, elle n'a donc pas besoin d'être Copyou Clone.

En revanche, les statics ne sont pas alignés:

struct A {
    pub val: u32
}

static GLOBAL_A: A = A {val: 2};

fn main() {
    let some_a: A = GLOBAL_A;
}

résulte en

error[E0507]: cannot move out of static item `GLOBAL_A`
 --> src/main.rs:8:21
  |
8 |     let some_a: A = GLOBAL_A;
  |                     ^^^^^^^^
  |                     |
  |                     move occurs because `GLOBAL_A` has type `A`, which does not implement the `Copy` trait
  |                     help: consider borrowing here: `&GLOBAL_A`
mcarton
la source