我有一些不可複製的類型和消耗以及(也許)產生它的功能:如何重新使用我已將值移出的框?
type Foo = Vec<u8>;
fn quux(_: Foo) -> Option<Foo> {
Some(Vec::new())
}
現在考慮一個類型,是某種概念上非常相似,Box
:
struct NotBox<T> {
contents: T
}
我們可以編寫一個功能,臨時移出NotBox
的內容,並在返回之前將其放回原處:
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
}
}
我想編寫與Box
ES工程類似的功能,但編譯器不喜歡它:
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
}
}
我能回到Some(Box::new(new_foo))
代替,但執行不必要的分配 - 我已經在我手上有一些記憶!有沒有可能避免這種情況?
我也想擺脫match
語句,但再次編譯器是不滿意的話(即使是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
})
}
是否有可能解決呢?
你似乎要求超過o ne問題在這裏。比賽vs地圖看起來應該是移動到一個新的問題。 –
我打算回答第一部分,但意識到我還不知道如何移出「Box'作品;它似乎並不涉及'Deref'或'DerefMut'特徵。所以期待一個很好的答案! –
@ChrisEmerson當我試圖創建我的問題的最小例子時,匹配部分就彈出來了,所以我沒有對它進行太多的研究。我只是認爲這可能與一般性問題有關,而且我沒有看到「部分」移動的工作方式,所以我把它留在了這裏。 – mrhania