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.
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.
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.