< 返回版块

Yesifan 发表于 2021-07-27 13:03

怎么让下面的函数编译通过。

error[E0308]: mismatched types
 --> src/main.rs:9:31
  |
8 |     Ok(1).map(|n| async { add(n).await })
  |                         ---------------- the expected `async` block
9 |     .unwrap_or_else(|_| async { 0 }).await
  |                               ^^^^^ expected `async` block, found a different `async` block
  |
  = note: expected `async` block `[static generator@src/main.rs:8:25: 8:41]`
             found `async` block `[static generator@src/main.rs:9:31: 9:36]`

Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=eb36dc8c7519459f9372c70980d1c881

评论区

写评论
作者 Yesifan 2021-07-27 13:37

谢谢,了解是怎么回事了

--
👇
Bai-Jinlin: unwarp的时候要求闭包返回的T和你Result的T一致,你map过后Result的T是一个匿名的实现了Future的类型,unwarp里的虽然也是实现Future的匿名类型但是和你map过后的Result T不是一个类型,所以报错了。 不过你可以这么改一下。

use futures::executor::block_on;
use futures::prelude::*;
use std::convert::Infallible;

async fn add(n: i32) -> i32 {
    n + 1
}

async fn test() -> i32 {
    Ok::<_, Infallible>(1)
        .map(|n| async move { add(n).await }.boxed())
        .unwrap_or_else(|_| async { 0 }.boxed())
        .await
}

fn main() {
    let n = block_on(test());
    println!("{}", n);
}
Bai-Jinlin 2021-07-27 13:33

unwarp的时候要求闭包返回的T和你Result的T一致,你map过后Result的T是一个匿名的实现了Future的类型,unwarp里的虽然也是实现Future的匿名类型但是和你map过后的Result T不是一个类型,所以报错了。 不过你可以这么改一下。

use futures::executor::block_on;
use futures::prelude::*;
use std::convert::Infallible;

async fn add(n: i32) -> i32 {
    n + 1
}

async fn test() -> i32 {
    Ok::<_, Infallible>(1)
        .map(|n| async move { add(n).await }.boxed())
        .unwrap_or_else(|_| async { 0 }.boxed())
        .await
}

fn main() {
    let n = block_on(test());
    println!("{}", n);
}
1 共 2 条评论, 1 页