如何从& mut迭代器中提取值?

时间:2016-05-16 06:06:07

标签: iterator rust lifetime borrow-checker mutability

我正在尝试创建一个将字符串映射到整数的迭代器:

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()表达式周围添加解除引用运算符不起作用,因为它抱怨借用这对我来说是令人惊讶的,因为我只是想复制该值。

1 个答案:

答案 0 :(得分: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();

当Rust支持non-lexical lifetimes时,这些问题有望消失。