为什么这段代码不编译:
fn use_cursor(cursor: &mut io::Cursor<&mut Vec<u8>>) {
// do some work
}
fn take_reference(data: &mut Vec<u8>) {
{
let mut buf = io::Cursor::new(data);
use_cursor(&mut buf);
}
data.len();
}
fn produce_data() {
let mut data = Vec::new();
take_reference(&mut data);
data.len();
}
这种情况下的错误是:
error[E0382]: use of moved value: `*data`
--> src/main.rs:14:5
|
9 | let mut buf = io::Cursor::new(data);
| ---- value moved here
...
14 | data.len();
| ^^^^ value used here after move
|
= note: move occurs because `data` has type `&mut std::vec::Vec<u8>`, which does not implement the `Copy` trait
io::Cursor::new
的签名意味着它拥有自己的论点.在本例中,参数是对Vec
的可变引用.
pub fn new(inner: T) -> Cursor<T>
这对我来说有点道理;因为Cursor::new
拥有其参数(而不是引用)的所有权,所以我们以后不能使用该值.同时,这也没有意义:我们本质上只传递一个可变的引用,之后游标无论如何都会超出范围.
我发现可以通过使用Cursor.into_inner()
来"回收"引用,但手动操作感觉有点奇怪,因为在正常使用情况下,借阅判断器完全可以自己完成.
有比使用.into_inner()
更好的解决方案吗?也许我对借书台还有什么不明白的?