Rust重导出crate结构体时能否预指定泛型参数固定类型
从crate重导出结构体时能否预先指定泛型参数?
带泛型参数的pub use写法不符合Rust语法规范,但可以通过两种成熟方案实现完全一致的效果,满足内部API无需重复传入固定泛型参数的需求:
方案1:类型别名(首选,代码量最小)
直接用type关键字定义固定泛型的公开类型别名即可。Rust原生支持通过类型别名直接调用原结构体的关联方法,所有原类型的方法、trait实现都能正常使用,和直接使用固定泛型后的原类型没有区别。
// file: transform.rs pub type Transform = euclid::Transform2d<f32, f32, f32>; // file: something-else.rs use transform::Transform; // 直接调用,无需传入任何泛型参数 let t = Transform::new(...);
这种方式属于纯别名,没有任何运行时开销,适合仅需要固定泛型参数、不需要额外扩展逻辑的场景。
方案2:Newtype包装(适合需要自定义扩展的场景)
如果需要给这个固定泛型的类型新增自定义方法、或者为其实现内部trait(受孤儿规则限制,类型别名无法为外部类型实现外部trait),可以用元组结构体做一层薄包装,通过实现Dereftrait透明调用原类型的方法。
// file: transform.rs // 包装固定泛型后的原类型,按需派生需要的trait #[derive(Debug, Clone, Copy, PartialEq)] pub struct Transform(pub euclid::Transform2d<f32, f32, f32>); // 实现Deref后,实例可以直接调用原类型的所有实例方法 impl std::ops::Deref for Transform { type Target = euclid::Transform2d<f32, f32, f32>; fn deref(&self) -> &Self::Target { &self.0 } } // 关联函数需要自行封装,实现和原方法一致的调用体验 impl Transform { pub fn new(/* 对应原new方法的参数 */) -> Self { Self(euclid::Transform2d::new(/* 传入对应参数 */)) } }
这种方案只有极薄的一层包装,同样没有额外运行时开销,灵活性更高。
内容的提问来源于stack exchange,提问作者Marais Rossouw
相关产品推荐
相关产品推荐

