Rust 从for循环中的DirEntry获取文件信息
我是个新手。我试图构建一个JSON对象,其中键是文件名,值是文件内容 到目前为止,我已经:Rust 从for循环中的DirEntry获取文件信息,rust,lifetime,Rust,Lifetime,我是个新手。我试图构建一个JSON对象,其中键是文件名,值是文件内容 到目前为止,我已经: use std::fs; use std::io; use std::env; use std::collections::HashMap; use std::path::{Path, PathBuf}; fn main() { make_json(); } fn make_json() -> io::Result<()> { let mut modules = Ha
use std::fs;
use std::io;
use std::env;
use std::collections::HashMap;
use std::path::{Path, PathBuf};
fn main() {
make_json();
}
fn make_json() -> io::Result<()> {
let mut modules = HashMap::new();
let mut dir = env::current_dir().unwrap();
let mut read_dir = fs::read_dir(dir);
for entry in try!(read_dir) {
let entry = try!(entry);
let file_name = entry.path().file_name().unwrap().to_string_lossy();
modules.insert(file_name, "");
}
Ok(())
}
我明白这个错误告诉了我什么;条目是在for
循环的范围内定义的,因此,如果我将其存储到HashMap
中,它将不再是有效内存,因为内存中的位置已经被释放。我明白了
我没有得到的是如何在不使用某种闭包的情况下访问read_dir
中的DirEntry
s,因为我需要在我检索它们的闭包之外的信息
我遇到的一切都无法帮助我。DirEntry.path()
返回一个PathBuf
,它是静态的(也就是说,它不包含非静态引用,是一个完全独立的对象)。这就是问题所在
PathBuf.file_name()
返回对该对象的引用以及。最后请注意,它不是静态的;随着省略寿命的恢复,它的fn to_string\u lossy Cow
是:它的变体,填充了泛型,是拥有的(string)
和借用的(&'a str)
)
在此位置,您需要将Cow
转换为字符串
。这是通过使用
因此,该代码行变为:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
DirEntry.path()。这就是问题所在
PathBuf.file_name()
返回对该对象的引用以及。最后请注意,它不是静态的;随着省略寿命的恢复,它的fn to_string\u lossy Cow
是:它的变体,填充了泛型,是拥有的(string)
和借用的(&'a str)
)
在此位置,您需要将Cow
转换为字符串
。这是通过使用
因此,该代码行变为:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
DirEntry.path()。这就是问题所在
PathBuf.file_name()
返回对该对象的引用以及。最后请注意,它不是静态的;随着省略寿命的恢复,它的fn to_string\u lossy Cow
是:它的变体,填充了泛型,是拥有的(string)
和借用的(&'a str)
)
在此位置,您需要将Cow
转换为字符串
。这是通过使用
因此,该代码行变为:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
DirEntry.path()。这就是问题所在
PathBuf.file_name()
返回对该对象的引用以及。最后请注意,它不是静态的;随着省略寿命的恢复,它的fn to_string\u lossy Cow
是:它的变体,填充了泛型,是拥有的(string)
和借用的(&'a str)
)
在此位置,您需要将Cow
转换为字符串
。这是通过使用
因此,该代码行变为:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是正确的,并将其调整到运行的状态。