Соответствует типу результата

#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 или какой-то тип ошибки.