Как мне найти индекс элемента в массиве, векторе или срезе?

Мне нужно найти индекс элемента в векторе строк. Это то, что я получил так далеко:

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);
}

Вы можете протестировать его здесь.

Обратите внимание, что это работает для любого итератора, поэтому его можно использовать для векторов, массивов и срезов, все из которых производят итераторы.