gpt4 book ai didi

rust - 使用HashMap解决借用问题(代码2020到来的破坏者)

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

第一次海报,对Rust来说还很陌生。在过去的几个月中,我一直在慢慢地与Rust玩弄,而最近我正在努力学习该语言。为了帮助我解决这个问题,我计划在Rust中解决今年Advent of Code中的所有问题。目前,我被困在第四天。如果您想阅读有关信息here is the link。显然,我可能会为你们中的一些人破坏这个问题,所以要警告!反正问题就解决了!
对于这个问题,我决定使用HashMap来解决第一部分。我来自Java和Python,因此我认为Rust的HashMap的工作方式类似于Java和Python的字典。我意识到这可能不是最佳解决方案,但是无论如何我都想尝试一下以了解HashMaps。这是我想出的代码。我试图注释该代码,以便于理解。

use std::fs::File;
use std::io::{BufRead, BufReader};
use std::collections::HashMap;

fn check_passport_valid(passport: HashMap<&str, &str>) -> bool {
return true;
}

fn main() {
// set up a bufReader to read the data
let data = "data/data.txt";
let file = File::open(data).unwrap();
let reader = BufReader::new(file);

// init a mutable HashMap
let mut passport: HashMap<&str, &str> = HashMap::new();
let mut count = 0;

// read the data in line by line
for line in reader.lines() {
// not sure if i should &line.unwrap() or do this
// seems to work the same in both situations
let s = line.unwrap();

// if line is blank check password and init new HashMap
if "" == s {
if check_passport_valid(passport) { count += 1; }
passport = HashMap::new();
}

// else put values into HashMap
else {
// first split into items
let items: Vec<&str> = s.split(' ').collect();
for item in items {
// split into key/value pair
let pair: Vec<&str> = item.split(':').collect();
passport.insert(pair[0], pair[1]);
}
}
}

println!("{}", count);
}
如您所见,它还没有完成,但是出现以下错误:
error[E0597]: `s` does not live long enough
--> src/main.rs:34:36
|
27 | if check_passport_valid(passport) { count += 1; }
| -------- borrow later used here
...
34 | let items: Vec<&str> = s.split(' ').collect();
| ^ borrowed value does not live long enough
...
41 | }
| - `s` dropped here while still borrowed

我尝试过尝试借用不同的值,但似乎无法使它正常工作。任何帮助将不胜感激!

最佳答案

您得到的错误是,从s.split(' ')获得的值是lines变量的片段,这实际上意味着它们引用了lines变量。在循环结束时,lines变量将被删除并由下一行替换,这将使对它的所有引用无效。最简单的方法是使用&strString转换为.to_owned()(拥有的类型),因此它将数据复制到不再依赖lines变量的静态内存位置:

use std::fs::File;
use std::io::{BufRead, BufReader};
use std::collections::HashMap;

// this is now HashMap<String, String> instead of HashMap<&str, &str>
fn check_passport_valid(passport: HashMap<String, String>) -> bool {
return true;
}

fn main() {
let data = "data/data.txt";
let file = File::open(data).unwrap();
let reader = BufReader::new(file);

// this is now HashMap<String, String> instead of HashMap<&str, &str>
let mut passport: HashMap<String, String> = HashMap::new();
let mut count = 0;

for line in reader.lines() {
let s = line.unwrap();

if "" == s {
if check_passport_valid(passport) { count += 1; }
passport = HashMap::new();
}

else {
let items: Vec<&str> = s.split(' ').collect();
for item in items {
let pair: Vec<&str> = item.split(':').collect();
// call to_owned on both elements
passport.insert(pair[0].to_owned(), pair[1].to_owned());
}
}
}

println!("{}", count);
}
阅读有关 strString here的更多信息。

关于rust - 使用HashMap解决借用问题(代码2020到来的破坏者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65191532/

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