gpt4 book ai didi

rust - Rust 中 map/flat_map 中变量的生命周期

转载 作者:行者123 更新时间:2023-11-29 08:22:55 24 4
gpt4 key购买 nike

我认为我对生命周期有很好的理解,但我读到的内容与编译器在闭包方面所说的不一致;)

我有一个带有签名的函数:

fn split_to_words(content: &str) -> Vec<String>

使用 for 循环看起来像这样:

let mut acc: Vec<String> = Vec::new();
for line in content.lines() {
if line.is_empty() { continue };
for word in line.split_whitespace() {
acc.push(word.to_lowercase());
}
}

并使用迭代器:

let acc: Vec<String> = content.lines()
.filter(|x| !x.is_empty())
.map(|x| x.to_lowercase())
.flat_map(|x: String| x.split_whitespace())
.map(|x| x.to_string())
.collect();

但我最终遇到了一个错误:

error: `x` does not live long enough

.flat_map(|x: String| x.split_whitespace())
^

最佳答案

您的迭代器样式代码与您的命令式代码不完全相同:在命令式代码中,您在 to_lowercase 之前执行 split_whitespace,而在迭代器中代码,你做相反的事情。事实证明,之前执行 split_whitespace 效率更高,因为 split_whitespace 不需要分配 Strings;它只将切片返回到给定的字符串切片中。另一方面,to_lowercase 需要分配一个新字符串,所以通过最后执行它,我们可以节省分配。

let acc: Vec<String> = content.lines()
.filter(|x| !x.is_empty())
.flat_map(|x| x.split_whitespace())
.map(|x| x.to_lowercase())
.collect();

关于rust - Rust 中 map/flat_map 中变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36967681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com