我正在尝试获取上次修改文件的时间,但出现字段未找到的错误。
use std::{fs, io, time};
fn main() -> io::Result<()> {
let metadata = fs::metadata("foo.txt")?;
let _time: time::SystemTime = metadata.modified().unwrap();
let last_modified = _time.tv_sec;
println!("{:?}", last_modified);
Ok(())
}
error[E0609]: no field `tv_sec` on type `std::time::SystemTime`
--> src/main.rs:6:31
|
6 | let last_modified = _time.tv_sec;
| ^^^^^^ unknown field
我还尝试了使用结果而不进行解包,但是我到达了要访问结构的tv_sec
字段的位置。
作为参考,在展开之前,结果为Ok(SystemTime { tv_sec: 000, tv_nsec: 000 })
,在展开之后,结果仅为SystemTime { tv_sec: 000, tv_nsec: 000 })
。
我对Rust还是很陌生,但是我已经整理了文档,并且从文档中看来,我应该能够像这样访问SystemTime
结构的字段。
答案 0 :(得分:5)
您无法访问tv_sec
,因为该字段不是公开的。这称为可见性,您可以在chapter 7.2 of the book中进行了解。
您只能在API of SystemTime
上的SystemTime
上调用公共方法。
出现“奇怪”错误消息i的原因,尽管调试表示表明它是一个“平坦”结构(例如,它具有两个字段tv_sec
和tv_nsec
),{{3 }},这意味着您必须调用.0
来获取内部字段,否则将导致错误
error[E0616]: field `0` of struct `std::time::SystemTime` is private
--> src/main.rs:10:22
|
10 | println!("{:?}", time.0);
| ^^^^^^
这样做是为了抽象化不同的操作系统;例如,Windows处理时间与Unix不同。
如果您想在几秒钟内获得“年龄”,则可以使用it is actually a tuple struct将其转换为Duration
,这将带给您Duration
的帮助,您可以在其中使用SystemTime::elapsed
。