我需要在字符串向量中找到元素的索引。这是我到目前为止所得到的:
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}}在这?如果有更好的方法,我愿意接受建议。
答案 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
方法可以满足您的需要。