我对 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::Json和warp::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() 中传递两个满足相同特征的不同结构?