Rust如何为自定义结构体实现支持usize索引的Index trait
问题原因
你的实现存在泛型参数混淆的问题,导致Index trait的实现永远无法被匹配:
- 结构体
A<'a, T>中的泛型T是内部切片的元素类型(你示例中是u64),而索引操作使用的usize是独立的索引类型,二者不能共用同一个泛型参数 - 你写的
impl<'a, T: Index<T, Output = T> + SliceIndex<[T], Output = T>> Index<T> for A<'a, T>相当于要求:- 元素类型
T自身可以作为[T]的切片索引(你示例中u64不满足这个要求,只有usize等索引类型才实现了SliceIndex<[T]>) - 结构体
A只支持用T类型作为索引,你示例中传的是usize类型的索引,和实现的Index<u64>完全不匹配
- 元素类型
所以编译器会认为你的A类型没有实现对应索引类型的Index trait,抛出E0608错误。
正确实现
将索引类型单独声明为独立泛型参数,仅约束该索引类型可以作为[T]的切片索引即可,你还可以天然获得和原生切片完全一致的索引能力(支持范围索引等):
use std::ops::Index; use std::slice::SliceIndex; struct A<'a, T> { slice: &'a [T] } // Idx是独立的索引泛型参数,约束它可以作为[T]的合法索引 impl<'a, T, Idx: SliceIndex<[T]>> Index<Idx> for A<'a, T> { type Output = Idx::Output; #[inline(always)] fn index(&self, index: Idx) -> &Self::Output { self.slice.index(index) } } fn main() { let aa: Vec<u64> = vec![0; 10]; let coefficient_iterable = A{slice: &aa}; // 支持usize索引 println!("{}", coefficient_iterable[1usize]); // 还天然支持范围索引 println!("{:?}", &coefficient_iterable[2..5]); }
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

