Warp:单条路线有效,多条 .or() 无效

Warp: single route works, multiple with .or() do not

希望有人能帮助我理解为什么 运行 warp 使用像这样的单个路由编译得很好:

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // GET /stats
    let stats = warp::get()
        .and(warp::path("stats"))
        .map(|| {
            let mut sys = System::new_all();
            sys.refresh_all();

            let local = LocalSystem::from_sys(&sys);
            warp::reply::json(&local);
        });

    // GET /
    let index = warp::get()
        .and(warp::path::end())
        .map(|| warp::reply::json(&last_ten_logs()));

    warp::serve(index).run(([127, 0, 0, 1], 4000)).await;

    Ok(())
}

但是将 warp::serve() 行更改为提供两条路由 like in the examples in the repo 会导致编译错误:

error[E0277]: the trait bound `(): Reply` is not satisfied
   --> src/main.rs:140:17
    |
140 |     warp::serve(stats.or(index)).run(([127, 0, 0, 1], 4000)).await;
    |     ----------- ^^^^^^^^^^^^^^^ the trait `Reply` is not implemented for `()`
    |     |
    |     required by a bound introduced by this call
    |
    = note: required because of the requirements on the impl of `Reply` for `((),)`
    = note: 2 redundant requirements hidden
    = note: required because of the requirements on the impl of `Reply` for `(warp::generic::Either<((),), (Json,)>,)`

我不明白编译器要求我更改什么。

错误很明显:

the trait Reply is not implemented for ()

问题是你的 stats 端点没有 return 任何东西,只是删除最后一个 ; 所以它被 returned 作为闭包中的最后一个表达式:

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // GET /stats
    let stats = warp::get()
        .and(warp::path("stats"))
        .map(|| {
            let mut sys = System::new_all();
            sys.refresh_all();

            let local = LocalSystem::from_sys(&sys);
            warp::reply::json(&local)
        });
    ...
}