fn get_variable_info (route_path: &str) -> HashMap<String, uint> {
let mut map = HashMap::new();
let mut i = 0;
for matched in REGEX_VAR_SEQ.captures_iter(route_path) {
map.insert(matched.at(1).to_string(), i);
i = i + 1;
}
map
}
我有这个函数需要&str
并循环Iterator
个捕获来生成HashMap<String, uint>
。我不喜欢这种势在必行的方式,并想知道这是否可以在Rust中以更实用的方式重写?
在伪代码中,类似这样的东西会更像我之后的目标。
let mut i = 0;
REGEX_VAR_SEQ
.captures_iter(route_path)
.map(| matched | {
KeyValuePair{
key: matched.at(1).to_string(),
value: i
}
i = i + 1;
KeyValuePair
})
.toHashMap()
嗯,这仍然不完美,因为我不喜欢i
变量,但我的第一个目标是摆脱命令性循环:)
答案 0 :(得分:4)
你很亲密!您的KeyValuePair
和toHashMap
实际上是Iterator.collect
,适用于FromIterator
特征,HashMap
为(K, V)
对实现。
因此,它类似于[(k, v), (k, v), (k, v)].move_iter().collect::<HashMap<K, V>>()
。
对于i
部分,有Iterator.enumerate
,将[a, b, c]
变为[(0, a), (1, b), (2, c)]
。
所以这是最终结果:
REGEX_VAR_SEQ.captures_iter(route_path)
.enumerate()
.map(|(i, matched)| (matched.at(1).to_string(), i))
.collect()
(您可以将HashMap<String, int>
保留为可以推断(例如方法返回类型),或者在collect
调用.collect::<HashMap<_, _>>()
上指定它。)