const ทั่วโลกที่ไม่คัดลอกหรือโคลนทำงานใน 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 และตามที่แสดงไม่สามารถเป็นกรณีใด ๆ เพราะมันสามารถ "ย้าย" สองครั้ง

มีกฎอะไรที่ช่วยให้ข้อมูลดังกล่าวข้างต้นในการทำงานพิจารณาAไม่ได้CloneหรือCopy?

คำตอบ:


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

ค่าจะถูกสร้างขึ้นใหม่เป็นครั้งที่สองจึงไม่จำเป็นต้องมีหรือCopyClone

ในทางกลับกันstatics จะไม่ inlined:

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.