gpt4 book ai didi

functional-programming - 如何在 Rust 中不那么命令式地重写它

转载 作者:行者123 更新时间:2023-11-29 08:13:06 25 4
gpt4 key购买 nike

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变量,但我的首要目标是摆脱命令式循环:)

最佳答案

你很接近!你的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<_, _>>()。)

关于functional-programming - 如何在 Rust 中不那么命令式地重写它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com