我想从a读取一行TCPStream,再写一行,然后重复.问题是BufReader::new获取我的TCPStream变量的所有权:
let stream = ...; // TCPStream
let reader = BufReader::new(stream); // moved its value
// can't use stream here anymore
Run Code Online (Sandbox Code Playgroud)
什么是简单的解决方案?
我的代码:
fn request_add<T>(request: &mut Request, collection_name: &'static str) -> Fallible<Fallible<String>>
where
T: serde::Serialize + serde::de::DeserializeOwned,
{
let add_dao = dao::MongoDao::new(collection_name);
let obj = serde_json::from_reader::<Body, T>(request.body)?; //cannot move out of borrowed content
Ok(add_dao.add(&obj))
}
Run Code Online (Sandbox Code Playgroud)
我有一个cannot move out of borrowed content错误,因为request是一个参考,但为什么不serde_json::from_reader使用mut引用?为什么需要所有权?我该如何解决?
当我查看File文档时,我发现该take方法需要一个self,而不是一个&self.但是我仍然可以在借用的引用上调用该方法:
fn foo(file: &File) {
let _ = file.take(1); // why does this work?
println!("can still use the file: {:?}", file);
}
Run Code Online (Sandbox Code Playgroud)
我认为self通过所有权,但我甚至可以file在通话后使用take所以所有权显然留在里面foo.
如果我自己在带有方法的自定义结构上执行此操作,则它不起作用:
struct Foo;
impl Foo {
fn foo(self: Foo) { }
}
fn main() {
let foo = &Foo;
foo.foo(); // error: cannot move out of borrowed content
}
Run Code Online (Sandbox Code Playgroud)
这完全是预料之中的.
同样根据文档,File据我所知,没有实现任何特殊的特征.引起我注意的是Read有一种by_ref()方法,但我没有称之为一切仍然有效.
这里发生了什么?(使用rustc 1.3.0-dev)