#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]);
}
Но я понимаю:
Ошибка:
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);
}