Передавать и использовать Type через аргумент функции?

#rust

#Ржавчина

Вопрос:

У меня есть простая функция, в которую я передаю a reqwest::Response , и она анализирует и возвращает некоторый JSON (используя Serde).

 #[derive(Serialize, Deserialize)]
struct Foo {
    field:String,
}

fn parse(response: reqwest::Response) -> Result<Foo, Error> {
    response.json::<Foo>().await?
}
  

Я хочу сделать это универсальным, чтобы тип не был жестко запрограммирован, и я мог передать тип. Вот некоторый мета-код для примера:

 fn parse(response: reqwest::Response, type: TYPE) -> Result<TYPE, Error> {
    response.json::<TYPE>().await?
}
  

Возможно ли это в Rust? Как бы я передал Foo тип? (или, может быть, одна из черт?) и использовать его в функции?

Ответ №1:

В rust обобщения представлены как <T> . В вашем случае T необходимо реализовать DeserializeOwned , чтобы десериализоваться из ответа json, чтобы вы могли добавить это в качестве привязки к T :

 fn parse<T: DeserializeOwned>(response: Response) -> Result<T, Error> {
    response.json::<T>().await?
}
  

Комментарии:

1. @user4815162342 Спасибо, что указали на это. Я обновил свой ответ, чтобы сделать это явным.