gpt4 book ai didi

rust - 如何 flat_map 并从字符串的迭代器中拆分

转载 作者:行者123 更新时间:2023-11-29 08:15:43 28 4
gpt4 key购买 nike

有没有办法在不切换到使用 iter 而不是 into_iter 的情况下完成这项工作?

let strings: Vec<String> = vec!["1 2".to_string(), "3 4".to_string()];
strings.into_iter().flat_map(|str| str.split(" "));

问题是

error[E0515]: cannot return value referencing function parameter `str`
--> src/lib.rs:3:40
|
3 | strings.into_iter().flat_map(|str| str.split(" "));
| ---^^^^^^^^^^^
| |
| returns a value referencing data owned by the current function
| `str` is borrowed here

当使用 iter 而不是 into_iter 时,我得到了一个引用迭代器并且一切正常,但我想知道是否可以在迭代器上进行这项工作String 的。

最佳答案

您的代码的问题在于您正在执行这些操作:

  1. 您正在使用 into_iter 消耗您的向量
  2. 因此,在闭包内,您通过 split
  3. 借用的值获取 String
  4. 在您的临时迭代器中,您持有对该字符串的引用

结论:您正在尝试返回对局部变量的引用。

要解决此问题,您必须从拆分字符串创建拥有的字符串,并收集它们以不再保留引用:

fn main() {
let strings = vec!["1 2".to_string(), "3 4".into()];
let result = strings.into_iter().flat_map(|str| str.split(" ").map(str::to_owned).collect::<Vec<_>>());

println!("{:?}", result.collect::<Vec<_>>());
}

事实上,一开始不使用向量的成本会更低:

fn main() {
let strings = vec!["1 2".to_string(), "3 4".into()];
let result = strings.iter().flat_map(|str| str.split(" ")).map(str::to_owned);

println!("{:?}", result.collect::<Vec<_>>());
}

关于rust - 如何 flat_map 并从字符串的迭代器中拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53680955/

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