Kopyalama veya klonlamayan genel sabitler Rust'da nasıl çalışır?


20

Aşağıdaki snippet'e sahip olduğumu söyle ( oyun alanı )

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

Yana Ane olduğunu Clonene de Copyben değerini varsayılabilir GLOBAL_Ataşınmış olacaktır. Bu bir sabit için pek bir anlam ifade etmez ve gösterildiği gibi iki kez "hareket ettirilebildiğinden" böyle bir durum söz konusu olamaz.

Ne izin kurallar işe yukarıdaki pasajı düşünen Adeğil Clone, ne de Copy?

Yanıtlar:


21

Sabitler daima eğimlidir. Örneğiniz esasen aynı

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

Değer iki kez yeniden oluşturulur, bu yüzden Copyveya olması gerekmez Clone.

Öte yandan, statics inline değildir:

struct A {
    pub val: u32
}

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

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

sonuç

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`
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.