Ho il seguente pezzo di codice:"Valore preso in prestito non vive abbastanza a lungo" quando si utilizza una struttura con una fetta
extern crate debug;
use std::mem::size_of_val;
struct A<'a> {
a: &'a [i64],
}
fn main() {
// code
}
Quando mi definisco una fetta con &
(cioè &[1, 2, 3]
) come nel seguente println!
println!("{} - {:?}", size_of_val(&A { a: &[1, 2, 3] }), A { a: &[1, 2, 3] });
l'uscita è
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
D efining una fetta senza &
println!("{} - {:?}", size_of_val(&A { a: [1, 2, 3] }), A { a: [1, 2, 3] });
mi dà lo stesso risultato
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
Se prima tenta di associare l'istanza di una struct A
, la cui a
campo viene inizializzato con un riferimento a una porzione (cioè utilizzando &
), ad una variabile x
let x = A { a: &[1, 2, 3] }; // &[1, 2, 3] is a reference to a slice
e cerco di eseguire un simile println!
come i precedenti
println!("{} - {:?}", size_of_val(&x), x);
ottengo
16 - A<'static>{a: &[1i64, 2i64, 3i64]}
Tuttavia, se mi legano un'istanza di A
, il cui campo a
è inizializzato su una sezione (non un riferimento a una sezione utilizzando &
), ad una variabile x
let x = A { a: [1, 2, 3] };
e cerco di eseguire un simile println!
come i precedenti
println!("{} - {:?}", size_of_val(&x), x);
ottengo il seguente errore di generazione:
/prpath/main.rs:12:20: 12:29 error: borrowed value does not live long enough /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; ^~~~~~~~~ /prpath/main.rs:11:11: 15:2 note: reference must be valid for the block at 11:10... /prpath/main.rs:11 fn main() { /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; /prpath/main.rs:13 /prpath/main.rs:14 println!("{} - `{:?}`", size_of_val(&x), x); /prpath/main.rs:15 } /prpath/main.rs:12:5: 12:31 note: ...but borrowed value is only valid for the statement at 12:4; consider using a `let` binding to increase its lifetime /prpath/main.rs:12 let x = A { a: [1 ,2, 3] }; ^~~~~~~~~~~~~~~~~~~~~~~~~~ error: aborting due to previous error
mi aspettavo che solo la definizione A { a: &[1, 2, 3] }
era consentita perché A.a
dovrebbe avere il tipo &[i64]
, ma, a quanto pare, Rust ci consente di non includere un simbolo &
.
Qual è la differenza tra A { a: &[1, 2, 3] }
e A { a: [1, 2, 3] }
? Perché siamo autorizzati a utilizzare A { a: [1, 2, 3] }
(nel secondo esempio sopra)?