Come funzionano i conti globali che non copiano o clonano in Rust?


20

Di 'che ho il seguente frammento ( parco giochi )

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);
}

Poiché Anon è né CloneCopy, suppongo che il valore di GLOBAL_Asarebbe spostato. Ciò non ha molto senso per una const e, come mostrato, non può essere il caso, poiché può essere "spostato" due volte.

Quali sono le regole che consentono al frammento di cui sopra di funzionare considerando Ano Cloneo Copy?

Risposte:


21

Le costanti sono sempre allineate. Il tuo esempio è essenzialmente lo stesso di

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);
}

Il valore viene ricostruito due volte, quindi non è necessario che sia Copyo Clone.

D'altra parte, le statics non sono in linea:

struct A {
    pub val: u32
}

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

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

risultati in

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`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.