Bagaimana cara konstanta global yang tidak menyalin atau mengkloning bekerja di Rust?

20

Katakanlah saya memiliki cuplikan ( taman bermain ) berikut

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

Karena Atidak Cloneatau tidak Copy, saya akan menganggap nilai GLOBAL_Aakan dipindahkan. Itu tidak masuk akal untuk const dan seperti yang ditunjukkan tidak dapat terjadi karena itu dapat "dipindahkan" dua kali.

Apa yang aturan yang memungkinkan potongan di atas bekerja mengingat Atidak Clonejuga Copy?

RecursiveExceptionException
sumber

Jawaban:

21

Konstanta selalu digarisbawahi. Contoh Anda pada dasarnya sama dengan

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

Nilai direkonstruksi dua kali, sehingga tidak perlu Copyatau Clone.

Di sisi lain, statics tidak digarisbawahi:

struct A {
    pub val: u32
}

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

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

hasil dalam

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
sumber