gpt4 book ai didi

rust - 如何在不担心可变借贷的情况下拆分字符串?

转载 作者:行者123 更新时间:2023-12-03 11:33:43 26 4
gpt4 key购买 nike

我目前正在尝试解决this challenge以学习Rust。我在下面创建了自己的解决方案:

use std::io;
use std::vec::Vec;
use std::collections::HashSet;

fn main() {
let stdin = io::stdin();
let mut buffer = String::new();
let mut set = HashSet::new();
let req = ["byr", "iyr", "eyr", "hgt", "hcl", "ecl", "pid", "cid"];
let mut res: u32 = 0;

while stdin.read_line(&mut buffer).unwrap() > 0 {
if buffer == "\n" {
for r in req.iter() {
if set.contains(r) {
set.remove(r);
}
}

if (set.len() == req.len()) || (set.len() == 7 && !set.contains("cid")) {
res += 1;
}
} else {
if buffer.ends_with('\n') {
buffer.pop();
}

let inputs: Vec<&str> = buffer.split_whitespace().collect();

for key_val in inputs {
let kval: Vec<&str> = key_val.split(':').collect();

set.insert(kval[0]);
}
}

buffer.clear();
}

println!("{}", res);
}
当我尝试编译它时,编译器输出错误:
error[E0502]: cannot borrow `buffer` as mutable because it is also borrowed as immutable

if (set.len() == req.len()) || (set.len() == 7 && !set.contains("cid")) {
| --- immutable borrow later used here
...
28 | let inputs: Vec<&str> = buffer.split_whitespace().collect();
| ------ immutable borrow occurs here
...
37 | buffer.clear();
| ^^^^^^^^^^^^^^ mutable borrow occurs here
我已经通过使用这种样式解决了其他问题(在某处使用 &mut buffersplit),而没有收到此错误。
为什么这里会发生此错误,我该如何解决?

最佳答案

查看您的set变量的类型。您可以通过在set as ()行之后写一个set.insert(...)来获得它。您会看到以下错误消息:

non-primitive cast: `HashSet<&str>` as `()`
因此,您设置了对 str的引用。但是这些引用文献住哪里。好吧,您的所有 str最终都来自 buffer,因此它们是对 buffer内容的引用。如果允许您执行 buffer.clear(),则所有这些引用都将失效。
您有两个基本选择:
  • 始终将所有行都保留在内存中,以便您在set中的引用不会无效。您可以使用`read
  • String中存储&str而不是set值。

  • 较简单的解决方案是#2:
    set.insert(kval[0].to_owned());
    有了该功能和一些其他小的修复程序,您的算法将进行编译( playground)。
    选项#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而不是 String,但是 set中的值的生存期将是循环外的 input的生存期。您将需要进行一些较小的修复,尤其是在行尾检查中。

    关于rust - 如何在不担心可变借贷的情况下拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65200225/

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