【发布时间】:2016-05-23 16:10:39
【问题描述】:
我正在使用 Nickel.rs 和 MongoDB 来构建 RESTful api。
我想为mongodb::error::Result<Option<bson::Document>> 类型实现一个通用的Responder。
这是我根据我为Responder找到的示例编写的实现:
impl<D> Responder<D> for Result<Option<Document>> {
fn respond<'a>(self, mut response: Response<'a, D>) -> MiddlewareResult<'a, D> {
response.set(MediaType::Json);
match self {
Ok(Some(doc))=>{
ApiResponse{data: Bson::Document(doc).to_json()}.to_json()
},
Ok(None)=>{
response.set(StatusCode::NotFound);
ApiError{error: "Not found".to_string()}.to_json()
},
Err(e)=>{
response.set(StatusCode::InternalServerError);
ApiError{error: format!("{}",e)}.to_json()
}
}
}
}
我收到以下错误:
错误:类型参数
D必须用作某些类型的参数 本地类型(例如MyStruct<T>);仅在当前定义的特征 可以为类型参数实现 crate [E0210]
我运行rustc --explain E0210 进行解释,如果我的理解是正确的,我需要提供一个特征D 作为impl<D> 的类型参数,但我不明白要提供哪个特征。
我尝试了impl<D: =()>,但产生了同样的错误。
【问题讨论】:
-
Responder特质从何而来? -
“必须在与 impl 相同的 crate 中定义 trait 或要实现它的类型 [...]”doc.rust-lang.org/book/…
-
@starblue:这是一个答案。你也可以扩展它来解释元组结构,它可以用来将一个类型包装在一个本地类型中,从而用它来实现特征。