如何在Rust中为泛型结构体添加相等类型约束?
解决Rust泛型结构体中关联类型相等的约束问题
要强制约束T::Input和T::Output为同一类型,你不需要用双向From转换(这只能实现类型间的互转,但编译器仍会将它们视为不同类型),直接在where子句中使用关联类型相等约束即可,这是Rust专门用于要求两个关联类型必须完全相同的语法。
正确的结构体定义写法
#[derive(Debug, Clone)] pub struct Example<T> where T::Input = T::Output, { // 你的结构体字段 }
为什么之前的写法无效?
你之前使用的T::Input: From<T::Output>和T::Output: From<T::Input>,只是要求两种类型可以互相转换,但它们在类型系统中仍然是不同的实体。编译器依然会严格区分T::Input和T::Output,所以当你把一个T::Output值传给需要T::Input的位置时,还是会报类型不匹配的错误。
更前置的约束方式(可选)
如果T是你自己定义的trait,你可以直接在trait定义阶段就约束Input和Output为同一类型,这样所有实现该trait的类型都会自动满足这个要求,结构体就不需要额外加where子句了:
trait MyTrait { // 定义一个基础类型 type InnerType; // 让Input和Output都等于InnerType type Input = Self::InnerType; type Output = Self::InnerType; // 你的trait方法 } // 此时结构体无需额外约束 #[derive(Debug, Clone)] pub struct Example<T: MyTrait> { // 结构体字段 }
这种写法能从根源上保证所有符合MyTrait的类型,其Input和Output必然是同一类型,代码会更简洁。
内容的提问来源于stack exchange,提问作者Roberto Esposito
相关产品推荐
相关产品推荐

