写了下面一段:
async fn put<'a, S, E, F>(
store: Arc<Mutex<dyn Storer<'a, dyn Stream<Item = Result<Bytes, E>>, dyn StdError + Send + Sync>>>,
) -> impl Fn(Request<Body>) -> Pin<Box<Future<Output = Result<Response<Body>, Infallible>>>> + 'a
where
S: Stream<Item = Result<Bytes, E>>,
E: StdError + Send + Sync + 'a,
{
move |req: Request<Body>| {
let store = store.clone();
async move {
store.lock().unwrap().put("ext", req);
Ok::<Response<Body>, Infallible>(Response::new(Body::default()))
}
.boxed()
}
}
编译器告诉我:
the `put` method cannot be invoked on a trait object
本着报错越短问题越大的原则,我的直觉告诉我,这问题不好对付,因为好对付的一般编译器直接给你建议了, 虽然准确度不是很高,但是至少多给你提供了点线索,像这种一句话的报错,答非所问的概率比较高,你看着它在说A问题,实际最终解决之后你会发现,这完完全全是B问题, 而且B问题跟A问题基本没啥联系。
难解决也得解决,从网上找了一圈,没有发现太好的解答,不过信息都指向了官

在尝试创建Trait对象时遇到了编译错误,原因是trait的某个方法包含了泛型参数,不符合对象安全性规则。对象安全是trait对象的必要条件,要求trait的所有方法不能返回Self类型并且不含有通用类型参数。通过将泛型参数替换为Box<dyn ...>,使用动态调度以实现运行时的灵活性,类似于Golang的interface,但Rust中由于泛型的存在,存在特定的限制。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



