web-dev-qa-db-fra.com

Comment trouver l'index d'un élément dans un tableau, un vecteur ou une tranche?

J'ai besoin de trouver un index d'un élément dans un vecteur de chaînes. Voici ce que j'ai obtenu jusqu'à présent:

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

Cela produit une erreur:

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

Je suppose que c'est parce que enumerate() renvoie un tuple de (usize, _) (Corrigez-moi si je me trompe), mais comment puis-je convertir usize en i32 Ici ? S'il existe une meilleure approche, je suis ouvert aux suggestions.

31
Caballero

Non, c'est parce que les indices sont usize, pas i32. En fait, i32 Est totalement inapproprié à cet effet; il n'est peut-être pas assez grand et il n'y a aucune raison qu'il soit signé. Utilisez simplement usize.

Quelques autres notes: appeler to_string() n'est pas gratuit, et vous n'en avez pas besoin pour la comparaison; vous pouvez très bien comparer les tranches de cordes!

De plus, si vous voulez vraiment transformer un usize en un i32, Vous pouvez le faire avec un cast: x as i32, Bien que cela ne produise pas une erreur de débordement ou de sous-débit ( ie le résultat peut être négatif).

Tout cela dit, comme indiqué dans la réponse de Mathieu David, il existe une méthode position sur les itérateurs qui fait ce que vous voulez.

18
DK.

Je pense que vous devriez plutôt regarder la méthode position .

fn main() {
    let test = vec!["one", "two", "three"];
    let index = test.iter().position(|&r| r == "two").unwrap();
    println!("{}", index);
}

Vous pouvez tester ici .

Notez que cela fonctionne pour n'importe quel itérateur, il peut donc être utilisé pour des vecteurs, des tableaux et des tranches, qui produisent tous des itérateurs.

53
Mathieu David