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

ボローチェッカーはレキシカルライフタイムルールを使用しているため、1つの式で競合する借用を持つことはできません。錆がnon-lexical lifetimesをサポートしているとき

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(); 

このような問題は、うまくいけば消えます。解決策は、別のletステートメントに長さを取得する抽出することです。

関連する問題