为什么看起来我可以从不可变的 BTreeMap 中使用值?



我正在做一个练习,其中我需要反转拼字游戏分数的地图;分数地图=>字母变成字母地图=>分数。我想出了以下 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 不会抱怨,尽管它是一个不可变的引用。

我在这里错过了什么?

打出问题后,我想出了答案。IntoIterator是为Vec实现的,也是为&Vec&mut Vec实现的。它不是使用Vec,而是使用引用并迭代对其元素的引用。非常简单的行为,但我设法以最令人困惑的方式做到这一点。

最新更新