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

时间:2018-10-06 02:27:41

标签: iterator rust immutability

我正在做一次运动,其中我需要颠倒拼字游戏的成绩图;分数地图=>字母变为字母地图=>分数。我想出了以下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是不可变的参考,但他没有抱怨。

我在这里想念什么?

1 个答案:

答案 0 :(得分:5)

输入问题后,我便找到了答案。 IntoIteratorVec实现,但也为&Vec&mut Vec实现。它不使用Vec,而是使用引用并对其元素的引用进行迭代。非常简单的行为,但是我设法以最令人困惑的方式做到了。