Rust, Trait Object, Object Safty

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

写了下面一段:

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问题基本没啥联系。

难解决也得解决,从网上找了一圈,没有发现太好的解答,不过信息都指向了官

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值