Как мне найти индекс элемента в массиве, векторе или срезе?
Мне нужно найти индекс элемента в векторе строк. Это то, что я получил так далеко:
fn main() {
let test: Vec<String> = vec![
"one".to_string(),
"two".to_string(),
"three".to_string(),
"four".to_string(),
];
let index: i32 = test
.iter()
.enumerate()
.find(|&r| r.1.to_string() == "two".to_string())
.unwrap()
.0;
}
выдает ошибку:
error[E0308]: mismatched types
--> src/main.rs:9:22
|
9 | let index: i32 = test
| ______________________^
10 | | .iter()
11 | | .enumerate()
12 | | .find(|&r| r.1.to_string() == "two".to_string())
13 | | .unwrap()
14 | | .0;
| |__________^ expected i32, found usize
Я предполагаю, что, поскольку enumerate()
возвращает кортеж (usize, _)
(исправьте меня, если я ошибаюсь), но как мне преобразовать usize
в i32
здесь? Если есть лучший подход, я открыт для предложений.
Ответы
Ответ 1
TLDR Используйте итератор с методом position
, документация по Rust показывает хороший пример.
Нет, это потому, что индексы - usize
, а не i32
. На самом деле, i32
совершенно не подходит для этой цели; он может быть недостаточно большим, и нет никаких оснований для его подписания. Просто используйте usize
.
Некоторые другие примечания: вызов to_string()
не бесплатный, и он не нужен для сравнения; Вы можете сравнить строки ломтиками просто отлично!
Кроме того, если вы действительно хотите превратить usize
в i32
, вы можете сделать это с помощью приведения: x as i32
, хотя это не приведет к ошибке в over- или недостаточном потоке (т.е. результат может быть отрицательным).
Все, что сказано, как отмечалось в ответе Матье Давида, есть position
метод на итераторах, который делает то, что вы хотите.
Ответ 2
Я думаю, вы должны посмотреть на position
.
fn main() {
let test = vec!["one", "two", "three"];
let index = test.iter().position(|&r| r == "two").unwrap();
println!("{}", index);
}
Вы можете протестировать его здесь.
Обратите внимание, что это работает для любого итератора, поэтому его можно использовать для векторов, массивов и срезов, все из которых производят итераторы.