我需要在字符串向量中找到元素的索引。这是我到目前为止得到的:
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 文档展示了一个很好的例子。
不,这是因为索引是
usize
,而不是 i32
。事实上,i32
完全不适合这个目的;它可能不够大,并且没有理由对其进行签名。只需使用usize
。
其他一些注意事项:调用
to_string()
不是免费的,您不需要它来进行比较;您可以很好地比较字符串切片!
此外,如果您真的想将
usize
变成i32
,您可以使用强制转换来实现:x as i32
,尽管这不会在溢出或下溢时产生错误( 即结果可能为负)。
总而言之,正如 Mathieu David 的回答中所指出的,迭代器上有一个 方法可以完成你想要的事情。