2016-05-16 8 views
0

Ich versuche, einen Iterator zu machen, die eine Zeichenfolge in eine ganze Zahl abbildet:Wie extrahiere ich Werte von & mut-Iterator?

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)

Das mit

nicht das Merkmal core::iter::FromIterator<&mut u32> ist nicht für den Typ implementiert collections::vec::Vec<u32>

Hinzufügen eines Dereferenzierungsoperators um den word_map.entry().or_insert() Ausdruck funktioniert nicht, da es sich über das Ausleihen beschwert, was für mich überraschend ist, da ich nur versuche, den Wert zu kopieren.

Antwort

3

Der Borg-Checker verwendet lexikalische Regeln für die Lebensdauer, sodass in einem einzelnen Ausdruck keine widersprüchlichen Ausleihen möglich sind. Die Lösung ist zu extrahieren, die Länge in eine separate let Anweisung bekommen:

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

Solche Fragen werden hoffentlich weg, wenn Rust non-lexical lifetimes unterstützt.

Verwandte Themen