#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 Спасибо, что указали на это. Я обновил свой ответ, чтобы сделать это явным.