У меня есть двумерный вектор, который отклоняет индексирование с использованием значений i32
, но работает, если я приведу эти значения с использованием as usize
:
#[derive(Clone)]
struct Color;
struct Pixel {
color: Color,
}
fn shooting_star(p: &mut Vec<Vec<Pixel>>, x: i32, y: i32, w: i32, h: i32, c: Color) {
for i in x..=w {
for j in y..=h {
p[i][j].color = c.clone();
}
}
}
fn main() {}
При компиляции я получаю сообщение об ошибке
error[E0277]: the trait bound `i32: std::slice::SliceIndex<[std::vec::Vec<Pixel>]>` is not satisfied
--> src/main.rs:11:13
|
11 | p[i][j].color = c.clone();
| ^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[std::vec::Vec<Pixel>]>` is not implemented for `i32`
= note: required because of the requirements on the impl of `std::ops::Index<i32>` for `std::vec::Vec<std::vec::Vec<Pixel>>`
Если я поменяю код на
p[i as usize][j as usize].color = c.clone();
, тогда все работает нормально.Однако, кажется, что это будет действительно странный выбор без причины, по которой тип Vec
не будет обработан.
В документации есть множество примеров, таких как
assert_eq!(vec[0], 1);
. Насколько я понимаю, если простое число без десятичной дроби по умолчанию является i32
,тогда нет никакой причины использовать i32
, чтобы индексирование не работало.