#rust #reqwest
Вопрос:
Вот пример:
#[tokio::main]
async fn main() {
let args: Vec<String> = env::args().collect();
let body = get_pokemon(amp;args[1]).await;
// here
let pokemon = parse_response(body);
}
struct Pokemon {}
async fn get_pokemon(pokemon: amp;String) -> reqwest::Result<String> {
let body = reqwest::get(format!("https://pokeapi.co/api/v2/pokemon/{}", pokemon))
.await?
.text()
.await?;
Ok(body)
}
async fn parse_response(response: String) -> Pokemon {}
body
имеет тип Result<String, Error>
, есть ли способ сопоставить то, что возвращает функция get_pokemon, с match
ключевым словом или чем-то подобным? т. Е. если она возвращает ошибку, сделайте это, если строка, сделайте это и т. Д.
Комментарии:
1. Да, использование
match
-довольно распространенный шаблон, как видно здесь .2. Я думаю, что get_pokemon должен возвращать результат<reqwest::Результат, reqwest::Ошибка>. Вы можете найти несколько примеров в dev.to/pintuch/rust-reqwest-examples-10ff
Ответ №1:
в случае с Rust очень часто требуется сопоставить возвращаемый тип функции, которая возвращает Result<T,E>
, где T
находится любой тип, возвращаемый при успешном выполнении, и E
тип ошибки, возвращаемый в случае ошибки. Что вы могли бы сделать, так это:
match body {
Ok(pokemon) => {
parse_response(body);//looking at get_pokemon `pokemon` will be of type String here
}
Err(e) => { // 'e' will be your error type
eprintln!("Error! {:?}", e)
}
}
Ваша функция возвращает a reqwest::Result<String>
. Не поработав с reqwest
вами, я не могу дать совет по решению этой конкретной Result
проблемы . Эта декларация выглядит аналогично std::io::Result<T>
тому, что является сокращением std::io::Result<T, std::io::Error>
. Это означает, что вы должны ожидать, что вы pokemon
будете иметь тип String
или какой-то тип ошибки.