Rust 如何展开映射并从字符串迭代器中拆分

Rust 如何展开映射并从字符串迭代器中拆分,rust,ownership,Rust,Ownership,有没有一种方法可以在不切换到使用iter而不是到iter的情况下实现这一点 let strings: Vec<String> = vec!["1 2".to_string(), "3 4".to_string()]; strings.into_iter().flat_map(|str| str.split(" ")); 当使用iter而不是进入iter时,我得到了一个引用迭代器,一切都正常,但我想知道是否有可能在Strings的迭代器上进行此操作。代码的问题是您正在执行这些操作:

有没有一种方法可以在不切换到使用
iter
而不是
到iter
的情况下实现这一点

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

当使用
iter
而不是
进入iter
时,我得到了一个引用迭代器,一切都正常,但我想知道是否有可能在
String
s的迭代器上进行此操作。

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

  • 您正在将向量与
    一起消耗到\u iter
  • 因此,在闭包内部,您使用
    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(){
    让strings=vec![“12.to_string(),“34.into()];
    让result=strings.into_iter().flat_map(| str | str.split(“”).map(str::to_owned.collect::());
    println!(“{:?}”,result.collect::());
    }
    
    事实上,一开始不使用矢量的成本更低:

    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<_>>());
    }
    
    fn main(){
    让strings=vec![“12.to_string(),“34.into()];
    让result=strings.iter().flat_-map(| str | str.split(“”)).map(str::to_-owned);
    println!(“{:?}”,result.collect::());
    }
    
    我也遇到了同样的问题,最终创建了一个迭代器,该迭代器拥有字符串的所有权,下面是代码。因为你是按空间分开的,所以应该合适

    struct单词{
    buf:字符串,
    抵销:usize,
    }
    言简意赅{
    fn新(buf:String)->单词{
    字{buf,偏移量:0}
    }
    }
    单词的impl迭代器{
    类型项=字符串;
    fn下一步(&mut self)->选项{
    设s=&(self.buf)[self.offset..];
    让left=s.chars().在(|x | x.是_空格())时取_。count();
    设right=left+s[left..].chars().take_while(|x |!x.is_whitespace()).count();
    如果左<右{
    self.offset+=右;
    返回一些(字符串::from(&s[left..right]);
    }
    没有一个
    }
    }
    
    这里是我如何使用它


    fn read\u file最后你想要什么?拥有或借用的字符串?下一步是使用
    .map
    将它们解析为整数,所以我想这没关系。我建议您在做复杂的事情之前,充分理解Rust的借用规则,否则您将无法做任何事情。