如何从 &mut 迭代器中提取值?
How to extract values from &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();
}
失败
the trait core::iter::FromIterator<&mut u32>
is not implemented for the type collections::vec::Vec<u32>
在 word_map.entry().or_insert()
表达式周围添加取消引用运算符不起作用,因为它抱怨借用,这让我感到惊讶,因为我只是想复制该值。
借用检查器使用词法生存期规则,因此您不能在单个表达式中有冲突的借用。解决方案是将获取长度提取到单独的 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 时,这些问题有望消失。
我正在尝试制作一个将字符串映射到整数的迭代器:
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();
}
失败
the trait
core::iter::FromIterator<&mut u32>
is not implemented for the typecollections::vec::Vec<u32>
在 word_map.entry().or_insert()
表达式周围添加取消引用运算符不起作用,因为它抱怨借用,这让我感到惊讶,因为我只是想复制该值。
借用检查器使用词法生存期规则,因此您不能在单个表达式中有冲突的借用。解决方案是将获取长度提取到单独的 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 时,这些问题有望消失。