我需要在字符串向量中找到元素的索引。这是我到目前为止所得到的:

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?如果有更好的方法,我欢迎您提出建议。

最佳答案

TLDR 使用带有position方法(Rust docs shows a good example)的迭代器。

不,这是因为索引是usize,而不是i32。实际上,i32完全不适合此目的;它可能不够大,没有理由对其进行签名。只需使用usize即可。

其他一些注意事项:调用to_string()并不是免费的,并且您不需要进行比较;您可以比较字符串切片就好了!

另外,如果您确实想将usize转换为i32,则可以使用强制转换:x as i32进行此操作,尽管这不会在上溢或下溢时产生错误(即结果可能为负)。

正如Mathieu David的回答所指出的那样,在迭代器上有一个 position 方法可以满足您的要求。

关于rust - 如何在数组,向量或切片中找到元素的索引?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30558246/

10-10 19:36