0

我对 Rust 很陌生,我似乎不明白为什么

此代码示例是使用带有warp的外部数据库的 Web 处理程序:

use super::data;

use std::convert::Infallible;

pub async fn get_product(id: u32, repo: data::Repository) -> Result<impl warp::reply::Reply, Infallible> {
    let result = repo.get_product(id.to_string()).await;

    match result {
        Ok(product) => Ok(warp::reply::json(&product)),
        Err(e) => {
            // add proper logging here
            println!("Error on get {}", e);
            Ok(warp::reply::with_status(warp::reply(), warp::http::StatusCode::BAD_REQUEST))
        },
        
    }
} 

我的理解是 Result 值是一个impl warp::reply::Reply,因此可以返回具有该特征的任何结构。这里使用了两个OK(),以符合 Infallible 错误策略。如果有错误,处理程序不应该抛出任何错误,而只是返回一个 400 错误。

两个结构都返回了——warp::reply::Jsonwarp::reply::WithStatus——实现了warp::reply::Reply特征。所以,在我从其他语言的角度来看,这应该是好的。

这是我得到的错误:

error[E0308]: mismatched types
  --> src/product.rs:13:16
   |
13 |             Ok(warp::reply::with_status(warp::reply(), warp::http::StatusCode::BAD_REQUEST))
   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `warp::reply::Json`, found struct `WithStatus`
   | 
  ::: /home/usename/.cargo/registry/src/github.com-1ecc6299db9ec823/warp-0.3.1/src/reply.rs:72:19
   |
72 | pub fn reply() -> impl Reply {
   |                   ---------- the found opaque type
   |
   = note: expected struct `warp::reply::Json`
              found struct `WithStatus<impl Reply>`

为什么我不能在不同的 Ok() 中传递两个满足相同特征的不同结构?

4

0 回答 0