我正在做一次运动,其中我需要颠倒拼字游戏的成绩图;分数地图=>字母变为字母地图=>分数。我想出了以下Rust代码:
use std::collections::BTreeMap;
pub fn transform(h: &BTreeMap<i32, Vec<char>>) -> BTreeMap<char, i32> {
h.iter()
.flat_map(|(&score, letters)| {
letters
.into_iter()
.map(move |l| (l.to_ascii_lowercase(), score))
})
.collect()
}
这行得通,但后来我意识到不行。 h
是不可变的引用。 h.iter()
遍历对其条目的引用,该条目的类型应为(&i32, &Vec<char>)
,但随后我将Vec
放入into_iter()
中进行使用。尽管Rust是不可变的参考,但他没有抱怨。
我在这里想念什么?
答案 0 :(得分:5)
输入问题后,我便找到了答案。 IntoIterator
为Vec
实现,但也为&Vec
和&mut Vec
实现。它不使用Vec
,而是使用引用并对其元素的引用进行迭代。非常简单的行为,但是我设法以最令人困惑的方式做到了。