Rust 从for循环中的DirEntry获取文件信息

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

我是个新手。我试图构建一个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 = 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();

您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是,并将其调整为运行的代码。您发布的代码不是您编译的代码。请确保它是正确的,并将其调整到运行的状态。