Как реализовать свойство » Индекс` для простой структуры?

#rust

Вопрос:

Я пытаюсь реализовать Index черту для простой черты, и я хочу использовать ее с usize . Я добавил SliceIndex<[T], Output = T> , чтобы я мог использовать T для индексирования slice внутри A .

 use std::ops::Index;
use std::slice::SliceIndex;

struct A <'a, T>{
    slice: amp;'a [T]
}

impl<'a, T: Index<T, Output = T>   SliceIndex<[T], Output = T>> Index<T>
    for A<'a, T>
{
    type Output = T;

    #[inline(always)]
    fn index(amp;self, index: T) -> amp;Self::Output {
        self.slice.index(index)
    }
}

fn main() {
    let mut aa: Vec<u64> = vec![0; 10];
    let coefficient_iterable = A{slice: amp;aa};
    println!("{}", coefficient_iterable[1usize]);
}
 

https://play.rust-lang.org/?version=stableamp;mode=debugamp;edition=2021amp;gist=9564b39061cae3e19db14217c10b9d8a

Но я понимаю:

Ошибка:

 error[E0608]: cannot index into a value of type `A<'_, u64>`
  --> src/main.rs:22:20
   |
22 |     println!("{}", coefficient_iterable[1usize]);
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0608`.
error: could not compile `playground` due to previous error
 

Я понятия не имею, почему, с тех пор usize SliceIndex<[T]>

Ответ №1:

Требование T быть и Index тем и SliceIndex другим не имеет смысла, потому Index что описывает поведение индексируемых контейнеров, в то время SliceIndex как вы можете использовать общий тип индексирования, чтобы сделать его более гибким.

Вы не хотите реализовывать Index<T> , потому T что здесь указан тип элементов в срезе, а не тип индекса. Чтобы код в вашей main функции работал , вы могли бы просто реализовать Index<usize> , но общая реализация Index<Idx> (где Idx: SliceIndex ) дает большую гибкость, поэтому вы также можете использовать диапазоны.

 use std::ops::Index;
use std::slice::SliceIndex;

struct A<'a, T> {
    slice: amp;'a [T],
}

impl<'a, T, Idx> Index<Idx> for A<'a, T>
where
    Idx: SliceIndex<[T], Output = T>,
{
    type Output = T;

    #[inline(always)]
    fn index(amp;self, index: Idx) -> amp;Self::Output {
        self.slice.index(index)
    }
}

fn main() {
    let aa: Vec<u64> = vec![0; 10];
    let coefficient_iterable = A { slice: amp;aa };
    assert_eq!(coefficient_iterable[1], 0);
}