假设我有以下片段(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,允许上述代码段工作的规则是什么?

推荐答案

常量总是内联的.你的例子基本上和

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`

Rust相关问答推荐

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

返回的future 不是`发送`

为什么Rust函数的移植速度比C++慢2倍?

在Rust中显式装箱受生存期限制的转换闭包

在本例中,为什么我不能一次多次borrow 可变变量?

如何设置activx websocket actorless的消息大小限制?

使用启用优化的 alloc 会导致非法指令崩溃

通过写入 std::io::stdout() 输出不可见

将泛型中的 Box 转换为 rust 中的 Box

Rust中如何实现一个与Sized相反的负特性(Unsized)

Rust编译器通过哪些规则来确保锁被释放?

枚举的利基优化如何在 Rust 中工作?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

由特征键控的不同 struct 的集合

在 Rust 中,将可变引用传递给函数的机制是什么?

你能告诉我如何在 Rust 中使用定时器吗?

Rust,使用枚举从 HashMap 获取值

如何在不设置精度的情况下打印浮点数时保持尾随零?

在 macro_rules 中转义 $ 美元符号