Ich habe einige nicht-kopierbaren Typ und eine Funktion, und (vielleicht) verbraucht, produziert sie:Wie kann ich eine Box wiederverwenden, aus der ich den Wert verschoben habe?
type Foo = Vec<u8>;
fn quux(_: Foo) -> Option<Foo> {
Some(Vec::new())
}
nun eine Art betrachten, die sehr ähnlich Box
irgendwie konzeptionell ist:
struct NotBox<T> {
contents: T
}
können wir schreiben eine Funktion, die in etwas Inhalt des NotBox
auszieht und legt vorübergehend zurück, bevor es zurückkehrt:
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
}
}
Ich mag eine analoge Funktion schreiben, die mit Box
es funktioniert, aber die Compiler es nicht mögen:
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
}
}
ich Some(Box::new(new_foo))
statt zurückkehren konnte, aber das führt unnötige Zuweisung - ich bereits etwas Speicher zur Verfügung habe! Ist es möglich, das zu vermeiden?
Ich würde auch die Beseitigung der match
Aussagen zu bekommen, aber wieder der Compiler ist nicht glücklich mit ihm (auch für die NotBox
Version):
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
})
}
Ist es möglich, um daran zu arbeiten?
Sie scheinen mehr als o fragen ne Frage hier. Die Übereinstimmung vs. Karte sieht so aus, als ob sie zu einer neuen Frage bewegt werden sollte. –
Ich wollte den ersten Teil beantworten, realisierte aber, dass ich noch nicht verstehe, wie der Wechsel von 'Box' funktioniert; Es scheint nicht mit "Deref" oder "DerefMut" Eigenschaften verwandt zu sein. Freue mich also auf eine gute Antwort! –
@ChrisEmerson Der Match-Teil war etwas, das auftauchte, als ich versuchte, das minimale Beispiel meines Problems zu erstellen, also habe ich nicht viel geforscht. Ich dachte nur, dass dies wahrscheinlich mit der allgemeinen Frage und der Tatsache zusammenhängt, dass ich nicht verstehe, wie "partielle" Bewegungen funktionieren, also habe ich es hier gelassen. – mrhania