【问题标题】:How to extract values from &mut iterator?如何从 &mut 迭代器中提取值?
【发布时间】:2016-05-16 06:06:06
【问题描述】:

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

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&lt;&amp;mut u32&gt; 没有为 collections::vec::Vec&lt;u32&gt; 类型实现

word_map.entry().or_insert() 表达式周围添加取消引用运算符不起作用,因为它抱怨借用,这让我感到惊讶,因为我只是想复制值。

【问题讨论】:

    标签: iterator rust lifetime borrow-checker mutability


    【解决方案1】:

    借用检查器使用词法生存期规则,因此您不能在单个表达式中出现冲突借用。解决方案是将获取长度提取到单独的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 时,这些问题有望消失。

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2014-09-26
      • 2011-03-26
      相关资源
      最近更新 更多