如何在Rust中重写不那么重要

时间:2014-06-13 22:01:23

标签: functional-programming rust

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变量,但我的第一个目标是摆脱命令性循环:)

1 个答案:

答案 0 :(得分:4)

你很亲密!您的KeyValuePairtoHashMap实际上是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<_, _>>()上指定它。)