我有一些不可复制的类型和一个消耗和(也许)产生它的函数:
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
})
}
有可能解决这个问题吗?