为什么serde_json :: from_reader拥有读者的所有权?

时间:2018-08-12 14:10:29

标签: json rust serde

我的代码:

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))
}

我有一个cannot move out of borrowed content错误,因为request是一个引用,但是为什么serde_json::from_reader不使用mut引用呢?为什么需要所有权?我该如何解决?

1 个答案:

答案 0 :(得分:13)

因为它是API guideline

  

通用读取器/写入器函数按值(C-RW-VALUE)取R: ReadW: Write

     

标准库包含以下两个提示:

impl<'a, R: Read + ?Sized> Read for &'a mut R { /* ... */ }

impl<'a, W: Write + ?Sized> Write for &'a mut W { /* ... */ }
     

这意味着任何接受R: ReadW: Write泛型的函数   如有必要,可以使用mut引用来调用按值设置的参数。

您可以致电Read::by_ref或自己参考:

serde_json::from_reader(&mut request.body)
serde_json::from_reader(request.body.by_ref())

另请参阅: