Rust调用DecoderRunnable::run报错cannot satisfy `_: DecoderRunnable<u8>`问题
错误原因
DecoderRunnable<T>是绑定在具体类型上的trait,你定义的run是不带self/&self参数的关联函数,调用DecoderRunnable::<u8>::run时仅指定了泛型参数T=u8,但没有指定该trait对应的实现类型:Rust的 trait 解析规则不会默认选择唯一实现,哪怕当前只有FfmpegDecoder<u8>实现了DecoderRunnable<u8>,也需要显式指定。
同时你的run方法逻辑和FfmpegDecoder类型没有任何绑定(参数未用到Self类型),把关联函数绑定到具体类型上本身属于不合理的设计。
修复方案
方案1:调用时明确指定实现类型
如果要保留当前的trait定义,直接指定调用FfmpegDecoder的实现即可,将main函数的调用行修改为:
<FfmpegDecoder<u8> as DecoderRunnable<u8>>::run(rr.clone());
该修改可以直接让编译通过。
方案2:调整trait设计,移除不必要的类型绑定
因为run方法不需要依赖Self类型,建议直接将trait定义作用于参数对应的Arc类型,更符合Rust使用习惯:
// 重新定义trait,绑定到参数类型本身 trait DecoderRunnable<T> { fn run(self); } impl<T: 'static + Send> DecoderRunnable<T> for Arc<dyn LockableOption<dyn Decoder<T>>> { fn run(self) { unimplemented!() } }
调整后调用逻辑可以简化为:
rr.run();
不需要额外类型标注即可正常编译。
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

