Почему serde_json :: from_reader получает право собственности на читателя?

Мой код:

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 ошибки cannot move out of borrowed content, потому что request является ссылкой, но почему serde_json::from_reader не использует ссылку mut? Зачем ему нужна собственность? И как я могу это исправить?

Ответ 1

Поскольку это руководство API:

Общие функции чтения/записи берут R: Read и W: Write по значению (C-RW-VALUE)

Стандартная библиотека содержит эти два модуля:

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

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

Это означает, что любая функция, которая принимает R: Read или W: Write общие параметры по значению, может быть вызвана с помощью ссылки mut если это необходимо.

Вы либо вызываете Read::by_ref либо просто берете ссылку самостоятельно:

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

Смотрите также: