Làm thế nào để các hằng số toàn cầu không sao chép hoặc sao chép hoạt động trong Rust?


20

Nói rằng tôi có đoạn trích sau ( sân chơi )

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

Akhông phải Clonecũng không Copy, tôi sẽ cho rằng giá trị của GLOBAL_Asẽ được di chuyển. Điều đó không có ý nghĩa nhiều đối với một const và như thể hiện không thể là trường hợp nào vì nó có thể được "di chuyển" hai lần.

Các quy tắc cho phép đoạn trích trên hoạt động Alà gì Clonecũng không phải là Copygì?

Câu trả lời:


21

Các hằng số luôn được nội tuyến. Ví dụ của bạn về cơ bản giống như

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

Giá trị được xây dựng lại hai lần, vì vậy nó không cần phải Copyhoặc Clone.

Mặt khác, statics không được nội tuyến:

struct A {
    pub val: u32
}

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

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

kết quả trong

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`
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.