ho qualche tipo non copiabile e una funzione che consuma e (forse) lo produce:Come posso riutilizzare una casella di cui ho rimosso il valore?
type Foo = Vec<u8>;
fn quux(_: Foo) -> Option<Foo> {
Some(Vec::new())
}
Consideriamo ora un tipo che è in qualche modo concettualmente molto simile a Box
:
struct NotBox<T> {
contents: T
}
Possiamo scrivere una funzione che sposta temporaneamente il contenuto dello NotBox
e rimette qualcosa prima di restituirlo:
fn bar(mut notbox: NotBox<Foo>) -> Option<NotBox<Foo>> {
let foo = notbox.contents; // now `notbox` is "empty"
match quux(foo) {
Some(new_foo) => {
notbox.contents = new_foo; // we put something back in
Some(notbox)
}
None => None
}
}
Voglio scrivere una funzione analoga che funziona con Box
es ma il compilatore non piace:
fn baz(mut abox: Box<Foo>) -> Option<Box<Foo>> {
let foo = *abox; // now `abox` is "empty"
match quux(foo) {
Some(new_foo) => {
*abox = new_foo; // error: use of moved value: `abox`
Some(abox)
}
None => None
}
}
potevo tornare Some(Box::new(new_foo))
invece, ma che esegue l'allocazione inutile - ho già qualche ricordo a mia disposizione! È possibile evitarlo?
Vorrei anche per sbarazzarsi dei match
dichiarazioni ma ancora una volta il compilatore non è soddisfatto (anche per la versione NotBox
):
fn bar(mut notbox: NotBox<Foo>) -> Option<NotBox<Foo>> {
let foo = notbox.contents;
quux(foo).map(|new_foo| {
notbox.contents = new_foo; // error: capture of partially moved value: `notbox`
notbox
})
}
E 'possibile ovviare a questo?
Sembra che tu stia chiedendo più di o ne domanda qui. La partita contro la mappa sembra essere spostata su una nuova domanda. –
Stavo per rispondere alla prima parte, ma mi sono reso conto che non ho ancora capito come si possa uscire da 'Box'; non sembra essere correlato ai tratti 'Deref' o' DerefMut'. Quindi non vedo l'ora di dare una buona risposta! –
@ChrisEmerson La parte della partita è stata qualcosa che è saltato fuori quando stavo cercando di creare l'esempio minimale del mio problema, quindi non ho fatto molte ricerche su di esso. Ho solo pensato che questo è probabilmente legato alla domanda generale e al fatto che non capisco come funzionano le mosse "parziali", quindi l'ho lasciato qui. – mrhania