不需要复制或克隆的全局常量在Rust中是如何工作的?

21

假设我有以下片段 (playground)

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

由于 A 既不是 Clone 也不是 Copy,我会假设 GLOBAL_A 的值会被移动。这对于一个常量来说没有太多意义,而且正如所示它不能被移动两次。

考虑到 A 不是 Clone 或者 Copy,有哪些规则可以使上面的代码片段能够工作呢?

1个回答

24

常量始终是内联的。您的示例本质上与以下代码相同:

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

该值重建了两次,因此不需要进行CopyClone操作。

另一方面,static变量不会被内联:

struct A {
    pub val: u32
}

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

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

导致

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`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接