Ho un programma che più o meno simile a questaNon può uscire di contenuti preso in prestito quando prendere in prestito un tipo generico
struct Test<T> {
vec: Vec<T>
}
impl<T> Test<T> {
fn get_first(&self) -> &T {
&self.vec[0]
}
fn do_something_with_x(&self, x: T) {
// Irrelevant
}
}
fn main() {
let t = Test { vec: vec![1i32, 2, 3] };
let x = t.get_first();
t.do_something_with_x(*x);
}
In sostanza, noi chiamiamo un metodo sul struct Test
che prende in prestito un certo valore. Quindi chiamiamo un altro metodo sulla stessa struttura, passando il valore ottenuto in precedenza.
Questo esempio funziona perfettamente. Ora, quando rendiamo il contenuto di main
generico, non funziona più.
fn generic_main<T>(t: Test<T>) {
let x = t.get_first();
t.do_something_with_x(*x);
}
allora ottengo il seguente errore:
error: cannot move out of borrowed content
src/main.rs:14 let raw_x = *x;
Io non sono del tutto sicuro perché questo sta accadendo. Qualcuno può spiegarmi perché Test<i32>
non viene preso in prestito quando si chiama get_first
mentre Test<T>
è?
Risposta molto utile, molte grazie! – NSAddict
L'uso di "moving bit" è un po 'confuso, poiché Rust si sposta spostando i bit. Forse "copiare i bit" sarebbe più chiaro? –
@MatthieuM. Sicuro. Aggiornato.Per quel che vale, ho preso il testo precedente direttamente dal riferimento del linguaggio: "Copia, per i tipi" Plain Old Data "che possono essere copiati semplicemente spostando i bit." – BurntSushi5