2016-05-16 54 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