如何在数组、向量或切片中找到元素的索引?

我需要在字符串的向量中找到一个元素的索引。这是我目前得到的信息:

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呢?如果有更好的方法,我愿意接受建议。

112121 次浏览

TLDR 使用带有 position方法的迭代器,Rust 文档 显示了一个很好的例子


不,这是因为指数是 usize,而不是 i32。实际上,i32完全不适合于此目的; 它可能不够大,没有理由对它进行签名。用 usize

还有一些注意事项: 调用 to_string()并不是免费的,您不需要它来进行比较; 您可以很好地比较字符串切片!

Also, if you 真的 want to turn a usize into an i32, you can do that with a cast: x as i32, though this will 没有 produce an error on over- or under-flow (也就是说。 the result may be negative).

正如 Mathieu David 的回答中所指出的那样,迭代器上有一个 position方法可以完成您想要的任务。

我认为您应该看看 position方法。

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

你可以 在这里测试

注意,这适用于任何迭代器,因此它可以用于向量、数组和切片,所有这些都产生迭代器。