6

我无法从Result. 每个教程只展示如何使用一个结果,而不是如何从它返回一个值。

fn main(){
    let mut a: Vec<String> = Vec::new();
    a = gottem();
    println!("{}", a.len().to_string());
    //a.push(x.to_string()
}
async fn gottem() -> Result<Vec<String>, reqwest::Error> {
    let mut a: Vec<String> = Vec::new();
    let res = reqwest::get("https://www.rust-lang.org/en-US/")
        .await?
        .text()
        .await?;
    Document::from(res.as_str())
        .find(Name("a"))
        .filter_map(|n| n.attr("href"))
        .for_each(|x| println!("{}", x));
    Ok(a)
}

我收到以下错误:

error[E0308]: mismatched types
 --> src/main.rs:13:9
   |
13 |     a = gottem();
   |         ^^^^^^^^ expected struct `std::vec::Vec`, found opaque type
...
18 | async fn gottem() -> Result<Vec<String>, reqwest::Error> {
   | ----------------------------------- the `Output` of this `async fn`'s found opaque type
   |
   = note:   expected struct `std::vec::Vec<std::string::String>`
       found opaque type `impl std::future::Future`
4

1 回答 1

10
  1. 您的函数不返回 a Result,它返回 a Future<Result>(因为它是一个异步函数),您需要将它提供给执行程序(例如block_on才能运行它;或者,reqwest::blocking如果您不关心异步位,则使用它会更容易
  2. 一旦执行器编辑,您的函数将返回 aResult但您试图将其放入 aVec中,这是行不通的

无关,但是:

println!("{}", a.len().to_string());

{}本质上是在to_string内部做一个,to_string调用是没有用的。

于 2020-06-30T10:57:14.307 回答