Почему, похоже, я могу использовать значение из неизменяемого BTreeMap? - PullRequest
0 голосов
/ 06 октября 2018

Я делаю упражнение, в котором мне нужно инвертировать карту результатов скрэббл;карта баллов => букв становится картой букв => баллов.Я придумал следующий код 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().Руст не жалуется, несмотря на то, что он является неизменной ссылкой.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 06 октября 2018

После ввода вопроса я разобрался с ответом.IntoIterator реализовано для Vec, но также для &Vec и &mut Vec.Вместо того, чтобы потреблять Vec, он использует ссылку и перебирает ссылки на свои элементы.Очень простое поведение, но мне удалось сделать это самым запутанным способом.

...