¿Cómo funcionan los consts globales que no son copia ni clon en Rust?

20

Digamos que tengo el siguiente fragmento (área de juegos )

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

Como Ano es ni Clonetampoco Copy, supondría que el valor de GLOBAL_Ase movería. Eso no tiene mucho sentido para una constante y, como se muestra, no puede ser el caso de todos modos, ya que se puede "mover" dos veces.

¿Cuáles son las reglas que permiten que el fragmento de código anterior funcione considerando Aque no es Cloneni Copy?

RecursiveExceptionException
fuente

Respuestas:

21

Las constantes siempre están en línea. Su ejemplo es esencialmente el mismo que

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

El valor se reconstruye dos veces, por lo que no necesita ser Copyo Clone.

Por otro lado, los statics no están en línea:

struct A {
    pub val: u32
}

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

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

resultados en

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`
mcarton
fuente