Rust에서 복사 또는 복제가 아닌 전역 const는 어떻게 작동합니까?


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

값은 두 번 재구성되므로 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.