コピーでもクローンでもないグローバル定数は、Rustでどのように機能しますか?


20

次のスニペット(遊び場)があるとしましょう

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が移動されると思います。これはconstにはあまり意味がなく、示されているように、2回「移動」できるため、とにかくそうなることはありません。

上記のスニペットを考慮動作するようルールはどのようなものAではありませんCloneCopy

回答:


21

定数は常にインライン化されます。あなたの例は本質的に同じです

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

値は2回再構築されるため、Copyまたはである必要はありませんClone

一方、staticsはインライン化されていません。

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`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.