是否有一种不使用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的迭代器上完成这个工作。
发布于 2018-12-08 08:59:30
代码的问题在于您正在执行以下操作:
into_iter消耗你的矢量String值,您用split借入该值结论:您正在尝试返回一个局部变量的引用。
要解决此问题,必须从拆分字符串中创建拥有的字符串,并收集它们以不再保存引用:
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<_>>());
}发布于 2020-08-14 02:31:50
我也遇到了同样的问题,最后创建了一个迭代器,它拥有字符串的所有权,下面是代码。既然你是按空间分裂的,它应该适合
struct Words {
buf: String,
offset: usize,
}
impl Words {
fn new(buf: String) -> Words {
Words { buf, offset: 0 }
}
}
impl Iterator for Words {
type Item = String;
fn next(&mut self) -> Option<String> {
let s = &(self.buf)[self.offset..];
let left = s.chars().take_while(|x| x.is_whitespace()).count();
let right = left + s[left..].chars().take_while(|x| !x.is_whitespace()).count();
if left < right {
self.offset += right;
return Some(String::from(&s[left..right]));
}
None
}
}在这里我是如何使用它的
fn read_file<'a>(buf: impl BufRead) -> impl Iterator<Item = String> {
buf.lines().filter_map(Result::ok).flat_map(Words::new)
}https://stackoverflow.com/questions/53680955
复制相似问题