Rust中如何在newtype中适配存储不同参数类型的闭包?
解决方法
你的核心问题在于:原代码试图在针对任意泛型P的impl块中,返回MyType<P>,但方法内部生成的适配闭包是一个独立的匿名类型,和外部指定的P完全不匹配。以下是两种可行的修复方案:
方案一:静态分发(无性能开销)
让MyType的泛型参数对应内部适配后的闭包类型,由编译器自动推断具体类型,完全保留静态分发的优势:
struct ExternalType<P> { predicate: P, } impl<P> ExternalType<P> where P: FnMut(u8) -> bool, { fn new(predicate: P) -> Self { ExternalType { predicate } } } // MyType的泛型参数对应适配后的闭包类型 struct MyType<Adapted> { ext: ExternalType<Adapted>, } impl MyType<impl FnMut(u8) -> bool> { fn new<Q>(mut user_predicate: Q) -> Self where Q: FnMut(u32) -> bool, { // 生成适配闭包:将u8转为u32后传给用户提供的闭包 let adapted = move |num: u8| user_predicate(num as u32); Self { ext: ExternalType::new(adapted), } } } // 使用示例 fn main() { let my_type = MyType::new(|x: u32| x > 10); }
方案二:动态分发(更灵活,有轻微开销)
如果不需要极致的性能,可以用Box<dyn FnMut(u8) -> bool>擦除类型,这样MyType无需泛型参数,使用更简洁:
struct ExternalType<P> { predicate: P, } impl<P> ExternalType<P> where P: FnMut(u8) -> bool, { fn new(predicate: P) -> Self { ExternalType { predicate } } } struct MyType { ext: ExternalType<Box<dyn FnMut(u8) -> bool>>, } impl MyType { fn new<Q>(mut user_predicate: Q) -> Self where Q: FnMut(u32) -> bool + 'static, { let adapted = Box::new(move |num| user_predicate(num as u32)); Self { ext: ExternalType::new(adapted), } } } // 使用示例 fn main() { let my_type = MyType::new(|x: u32| x > 10); }
问题根源解释
你之前的代码中,impl<P> MyType<P>表示该实现块对任意P类型生效,但new方法内部生成的闭包是一个编译器自动生成的匿名类型,和外部指定的P没有任何关联,因此必然出现类型不匹配的错误。修复的核心是让MyType的泛型参数(或内部存储的类型)对应实际要保存的适配闭包类型,而非强行绑定一个无关的外部泛型参数。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

