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

Cab*_*ero 36 rust

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

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;
}
Run Code Online (Sandbox Code Playgroud)

它会产生错误:

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
Run Code Online (Sandbox Code Playgroud)

我认为这是因为enumerate()返回一个元组(usize, _)(如果我错了,请纠正我),但是如何转换usizei32这里?如果有更好的方法,我愿意接受建议.

Mat*_*vid 59

我认为你应该看看这个position方法.

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

你可以在这里测试一下.

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


DK.*_*DK. 21

不,这是因为指数position不是usize.事实上,i32完全不适合这个目的; 它可能不够大,没有理由签名.只是用i32.

其他一些注意事项:呼叫usize不是免费的,你不需要它进行比较; 你可以比较字符串切片就好了!

此外,如果你真的想把a to_string()变成a usize,你可以用一个强制转换来做到这一点:i32虽然这不会在过流量或流量不足时产生错误(结果可能是负数).

所有这一切,正如Mathieu David的回答所指出的那样,x as i32迭代器上有一种方法可以满足您的需求.