2016-05-16 2 views
0

Я пытаюсь сделать итератор, который отображает строку в целое число:Как извлечь значения из итератора & mut?

fn main() { 
    use std::collections::HashMap; 

    let mut word_map = HashMap::new(); 

    word_map.insert("world!", 0u32); 

    let sentence: Vec<&str> = vec!["Hello", "world!"]; 

    let int_sentence: Vec<u32> = sentence.into_iter() 
     .map(|x| word_map.entry(x).or_insert(word_map.len() as u32)) 
     .collect(); 

} 

(Rust playground)

Это терпит неудачу с

черта core::iter::FromIterator<&mut u32> не реализована для типа collections::vec::Vec<u32>

Добавление оператора разыменования вокруг word_map.entry().or_insert() выражение не работает, поскольку он жалуется на заимствование, что удивительно для меня, поскольку я просто пытаюсь скопировать значение.

ответ

3

Контроллер заимствования использует лексические правила жизни, поэтому вы не можете иметь конфликтующие роли в одном выражении. Решение состоит в том, чтобы извлечь получать длину в отдельную let заявление:

let int_sentence: Vec<u32> = sentence.into_iter() 
     .map(|x| *({let len = word_map.len() as u32; 
        word_map.entry(x).or_insert(len)})) 
     .collect(); 

Такие вопросы, как мы надеемся, уходят, когда Руст поддерживает non-lexical lifetimes.

Смежные вопросы