Rust泛型trait自动实现未对符合约束的结构体生效问题
问题核心原因
你的自动实现块出现了泛型参数命名冲突,导致约束逻辑和你的预期完全不符:
你写的自动实现代码如下:
impl< T: AsRef<[T]> + Index<I, Output = T>, I: SliceIndex<[T], Output = T>, > A<T, I> for T
这里的泛型参数T指代需要实现A trait的类型本身,约束AsRef<[T]>的含义是:该类型要能转换为「元素为自身类型的切片」,这和你预期的「类型能转换为元素类型为任意T的切片」完全不一致。
而你的结构体B<'a, Elem>实现的是AsRef<[Elem]>(元素是泛型参数Elem,不是B本身),完全不满足你写的约束,所以自动实现不会匹配到B类型,自然会报未实现A trait的错误。
修复方案
将自动实现块的泛型参数改名,区分开「实现A trait的类型」和「切片的元素类型」即可:
// X:要实现A trait的类型,Elem:切片存储的元素类型,I:索引类型 impl< X: AsRef<[Elem]> + Index<I, Output = Elem>, Elem, I: SliceIndex<[Elem], Output = Elem>, > A<Elem, I> for X { fn len(&self) -> usize { self.as_ref().len() } }
修改后约束逻辑和你的预期一致,B类型满足所有约束,会自动实现A trait,编译可以正常通过。
内容的提问来源于stack exchange,提问作者Rafaelo
相关产品推荐
相关产品推荐

