gpt4 book ai didi

rust - 我认为我没有借用的变量的生命周期错误

转载 作者:行者123 更新时间:2023-11-29 08:24:40 25 4
gpt4 key购买 nike

我有一段代码可以递归地读取一个目录并为每个文件创建一个散列。这是代码:

//read the file paths all the way upto individual files
for dir in search_dirs.iter(){
//read the dir, skip errors (hidden files, syslinks etc)
for e in WalkDir::new(dir).into_iter().filter_map(|e| e.ok()) {
//check if it's a file, continue
if metadata(e.path().display().to_string()).unwrap().is_file(){

//"clone" std::path::Path as &str
let file_path = e.path().to_str().unwrap().clone();
//create a new FileInfo Object
let mut file_obj = FileInfo::new(None, None, file_path);
file_obj.generate_hash();
file_obj.generate_path_hash();

//count the num for each file content hash ~ HashMap
*file_counter.entry( file_obj.get_hash() ).or_insert(0) += 1;

//HashMap for file path hash and FileInfo Object

/*If I add this statement I have an Error: E0597
file_info.entry(file_obj.get_path_hash())
.or_insert(file_obj.clone());
*/
}
}
}

如果我添加 file_info.entry(file_obj.get_path_hash()).or_insert(file_obj.clone()) 我会收到错误 E0597

error[E0597]: `e` does not live long enough                                     
--> src/main.rs:41:33
|
41 | let file_path = e.path().to_str().unwrap().clone();
| ^ borrowed value does not live long enough
...
48 | file_info.entry(file_obj.get_path_hash() ).or_insert(file_obj.clone());
| --------- borrow used here, in later iteration of loop
49 | }
50 | }
| - `e` dropped here while still borrowed

问题

  • 我克隆了e,我不认为我借用了它。
  • 我没有在其他任何地方使用“e”,那么编译器为什么要关心它呢?它可以被丢弃。

最小的、完整的和可验证的示例:main.rs lib.rs

最佳答案

FileInfo 包含对 str 的引用,而不是对拥有的 String 的引用。这意味着它只能在它引用的 str 中存在。

您试图通过克隆 e.path().to_str() 来避免该问题。这样,您就有了一个不应以任何方式绑定(bind)到 e 的新副本。这是正确的,但因为克隆是在循环的一次迭代中创建的,所以它只在循环的那次迭代中存在。

所以最终,克隆并没有改变任何东西,因为生命周期还是一样的(你可以试试)。

一种解决方案是修改 FileInfo,使其包含 String 而不是 &str。这样,每个 FileInfo 实例都可以在没有生命周期冲突的情况下自由移动。

关于rust - 我认为我没有借用的变量的生命周期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53689622/

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