在 for 循环中从 DirEntry 获取文件信息
get file information from DirEntry in a for loop
我是 Rust 的新手。我正在尝试构建一个 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(())
}
当我去编译它时,我得到
src/main.rs:19:25: 19:37 error: borrowed value does not live long enough
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~
note: in expansion of for loop expansion
src/main.rs:17:5: 21:6 note: expansion site
src/main.rs:13:38: 23:2 note: reference must be valid for the block suffix following statement 0 at 13:37...
src/main.rs:13 let mut modules = HashMap::new();
src/main.rs:14 let mut dir = env::current_dir().unwrap();
src/main.rs:15 let mut read_dir = fs::read_dir(dir);
src/main.rs:16
src/main.rs:17 for entry in try!(read_dir) {
src/main.rs:18 let entry = try!(entry);
...
src/main.rs:19:9: 19:77 note: ...but borrowed value is only valid for the statement at 19:8
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:19:9: 19:77 help: consider using a `let` binding to increase its lifetime
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
我明白这个错误告诉我什么;条目是在 for
循环的范围内定义的,因此如果我将它存储到 HashMap
它将不再是有效内存,因为内存中的位置已经被释放。我明白了。
我不明白的是,我如何在不使用某种闭包的情况下访问 read_dir
中的 DirEntry
,因为我需要在检索它们的任何闭包之外获取它们的信息英寸
我遇到的一切都无法帮助我。
DirEntry.path()
returns a PathBuf
,即 'static
(即它不包含非静态引用,是一个完全独立的对象)。 就是问题所在
PathBuf.file_name()
returns Option<&OsStr>
,对该对象的引用,以及 OsStr.to_string_lossy()
returns Cow<str>
。请注意,最后它是 而不是 'static
;恢复被删除的生命周期后,它是 fn to_string_lossy<'a>(&'a self) -> Cow<'a, str>
。这是为了提高效率,因为如果路径是合法的 UTF-8,那么就没有必要去创建一个全新的拥有的字符串(String
),它可以将它保留为一个字符串切片(&str
)。 (因为这就是 Cow<'a, str>
:它的变体,填充了泛型,是 Owned(String)
和 Borrowed(&'a str)
。)
您需要在此位置将 Cow<str>
变成 String
。这是通过 into_owned
method of Cow<T>
.
完成的
这行代码就这样变成了:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
处理 Rust 文件系统时的问题迫使我创建这个 Rust 库 brown
在处理 Rust fs 时,特别是在处理循环时,主要问题是每个东西 return 都是另一个东西,然后我们需要转换那个东西。
我们需要一些东西来为我们压扁物品
My suggestion :: Do not do any calculations etc in a loop, it should just have function calls to a well tested library and just checking its results.
我是 Rust 的新手。我正在尝试构建一个 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(())
}
当我去编译它时,我得到
src/main.rs:19:25: 19:37 error: borrowed value does not live long enough
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~
note: in expansion of for loop expansion
src/main.rs:17:5: 21:6 note: expansion site
src/main.rs:13:38: 23:2 note: reference must be valid for the block suffix following statement 0 at 13:37...
src/main.rs:13 let mut modules = HashMap::new();
src/main.rs:14 let mut dir = env::current_dir().unwrap();
src/main.rs:15 let mut read_dir = fs::read_dir(dir);
src/main.rs:16
src/main.rs:17 for entry in try!(read_dir) {
src/main.rs:18 let entry = try!(entry);
...
src/main.rs:19:9: 19:77 note: ...but borrowed value is only valid for the statement at 19:8
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:19:9: 19:77 help: consider using a `let` binding to increase its lifetime
src/main.rs:19 let file_name = entry.path().file_name().unwrap().to_string_lossy();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
我明白这个错误告诉我什么;条目是在 for
循环的范围内定义的,因此如果我将它存储到 HashMap
它将不再是有效内存,因为内存中的位置已经被释放。我明白了。
我不明白的是,我如何在不使用某种闭包的情况下访问 read_dir
中的 DirEntry
,因为我需要在检索它们的任何闭包之外获取它们的信息英寸
我遇到的一切都无法帮助我。
DirEntry.path()
returns a PathBuf
,即 'static
(即它不包含非静态引用,是一个完全独立的对象)。 就是问题所在
PathBuf.file_name()
returns Option<&OsStr>
,对该对象的引用,以及 OsStr.to_string_lossy()
returns Cow<str>
。请注意,最后它是 而不是 'static
;恢复被删除的生命周期后,它是 fn to_string_lossy<'a>(&'a self) -> Cow<'a, str>
。这是为了提高效率,因为如果路径是合法的 UTF-8,那么就没有必要去创建一个全新的拥有的字符串(String
),它可以将它保留为一个字符串切片(&str
)。 (因为这就是 Cow<'a, str>
:它的变体,填充了泛型,是 Owned(String)
和 Borrowed(&'a str)
。)
您需要在此位置将 Cow<str>
变成 String
。这是通过 into_owned
method of Cow<T>
.
这行代码就这样变成了:
let file_name = entry.path().file_name().unwrap().to_string_lossy().into_owned();
处理 Rust 文件系统时的问题迫使我创建这个 Rust 库 brown
在处理 Rust fs 时,特别是在处理循环时,主要问题是每个东西 return 都是另一个东西,然后我们需要转换那个东西。 我们需要一些东西来为我们压扁物品
My suggestion :: Do not do any calculations etc in a loop, it should just have function calls to a well tested library and just checking its results.