【问题标题】:How do I find the index of an element in an array, vector or slice?如何找到数组、向量或切片中元素的索引?
【发布时间】:2015-05-31 13:54:16
【问题描述】:

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

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

【问题讨论】:

    标签: rust


    【解决方案1】:

    我认为您应该改用position 方法。

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

    你可以test it here

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

    【讨论】:

      【解决方案2】:

      TLDR 使用带有position 方法的迭代器,Rust 文档shows a good example


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

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

      另外,如果您真的想将usize 转换为i32,您可以使用演员表:x as i32,尽管这不会 产生溢出或下溢错误(结果可能为负)。

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

      【讨论】:

        猜你喜欢
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 2015-11-04
        相关资源
        最近更新 更多