Rust 如何在不担心可变借词的情况下拆分字符串?

Rust 如何在不担心可变借词的情况下拆分字符串?,rust,Rust,我目前正在尝试解决学习生锈的问题。我在下面创建了自己的解决方案: 使用std::io; 使用std::vec::vec; 使用std::collections::HashSet; fn干线{ 设stdin=io::stdin; 让mut buffer=String::new; 让mut set=HashSet::new; let req=[byr,iyr,eyr,hgt,hcl,ecl,pid,cid]; 设mut res:u32=0; 而标准读取行和多缓冲区展开>0{ 如果缓冲区==\n{ 对

我目前正在尝试解决学习生锈的问题。我在下面创建了自己的解决方案:

使用std::io; 使用std::vec::vec; 使用std::collections::HashSet; fn干线{ 设stdin=io::stdin; 让mut buffer=String::new; 让mut set=HashSet::new; let req=[byr,iyr,eyr,hgt,hcl,ecl,pid,cid]; 设mut res:u32=0; 而标准读取行和多缓冲区展开>0{ 如果缓冲区==\n{ 对于req.iter{ 如果set.sr{ 集料器; } } 如果set.len==req.len | | set.len==7&&!set.containsId{ res+=1; } }否则{ if buffer.以“\n”结尾{ buffer.pop; } 让输入:Vec=buffer.split_whitespace.collect; 用于输入中的键值{ 让kval:Vec=key_val.split':'.collect; set.insertkval[0]; } } 缓冲区。清除; } println!{},res; } 当我试图编译它时,编译器输出错误:

错误[E0502]:无法将'buffer'作为可变项借用,因为它也是作为不可变项借用的 如果set.len==req.len | | set.len==7&&!set.containscid{ |-此处稍后使用的不可变借用 ... 28 | let输入:Vec=buffer.split_whitespace.collect; |---此处发生不可变借用 ... 37 |缓冲区。清除; |^^^^^^^^^^^^^^^^^^^^此处发生可变借用 在使用&mut buffer之前,我使用这种样式解决了其他问题,并将其拆分到某个地方而不会出现此错误

为什么这里会发生此错误?我如何修复它?

查看集合变量的类型。您可以通过在集合之后写入集合来获得它。插入…行。您将看到此错误消息:

non-primitive cast: `HashSet<&str>` as `()`
有了这些和其他一些小的修正,你的算法就可以编译了

选项1需要将整个stdin读入一个变量,然后遍历以下行:

    use std::io::Read;
    let mut stdin = io::stdin();
    let mut input = String::new();
    stdin.read_to_string(&mut input).unwrap();
    for buffer in input.lines() {
       ...
    }

现在buffer是一个&str而不是一个字符串,但是set中的值的生存期将是循环之外的输入的生存期。您需要一些小的修复,特别是在行尾检查时。

查看set变量的类型。您可以通过在set.insert…line之后写入set来获得它。您将看到此错误m短文:

non-primitive cast: `HashSet<&str>` as `()`
有了这些和其他一些小的修正,你的算法就可以编译了

选项1需要将整个stdin读入一个变量,然后遍历以下行:

    use std::io::Read;
    let mut stdin = io::stdin();
    let mut input = String::new();
    stdin.read_to_string(&mut input).unwrap();
    for buffer in input.lines() {
       ...
    }


现在buffer是一个&str而不是一个字符串,但是集合中的值的生存期将是循环之外的输入的生存期。您需要一些小的修复,特别是在行结束检查时。

您已经读过了吗?@mkrieger1,是的。但是我不明白buffer.split_空格为什么被认为是不可变的借用。它是一个不可变的表借用,因为它返回从原始缓冲区借用的片。只要它们存在,它就被认为是借用的。@rodrigo,但我已经声明缓冲区是可变的,借用不也应该被认为是可变的吗?不,split_空格接受一个&self,而不是&mut self,所以它不可变地借用缓冲区,无论它是否是declared mut与否。但即使它是可变借用的,这对代码也没有帮助,因为你不能可变借用一个值两次。你已经读过了吗?@mkrieger1,是的。但我不明白为什么buffer.split_空格被视为不可变借用。它是不可变借用,因为它返回从原始缓冲区借用的片。只要在他们的生活中,它被认为是借用的。@rodrigo,但是我已经声明缓冲区是可变的,借用不也应该被认为是可变的吗?不,split_空格接受一个&self,而不是&mut self,所以它不可变地借用缓冲区,无论它是否被声明为mut。但即使它是可变借用的,这对代码也没有帮助,因为你不能可变地借用一个值两次。谢谢,但是为什么要使用字符串?我可以改用&str吗?@CristopherNamchee:你的意思是作为集合中的一个类型吗?因为&str是借用的类型,根据定义,因为它是引用,而字符串不是。为了让非“静态”的&str存在,必须在某个地方有一个借用的值。谢谢,但是为什么要使用字符串?我可以改用&str吗?@CristopherNamchee:你的意思是作为集合中的一个类型吗?因为&str是借用的类型,从定义上来说,因为它是引用,而字符串不是。为了使非“静态”的&str存在,必须在某个地方有一个借用的值。