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

时间:2015-05-31 13:54:17

标签: 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;
}

产生错误:

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转换为{{ 1}}在这?如果有更好的方法,我愿意接受建议。

2 个答案:

答案 0 :(得分:43)

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

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

你可以test it here

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

答案 1 :(得分:16)

不,这是因为索引是$('#edValue').css('color','black');,而不是usize。事实上,i32完全不适合此目的;它可能不够大,没有理由签名。只需使用i32

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

另外,如果确实希望将to_string()转换为usize,您可以使用强制转换:i32执行此操作,但这会< em> not 在流量过大或流量不足时产生错误(结果可能是负数)。

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