Поле tv_sec не существует в структуре SystemTime - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь получить последний раз, когда файл был изменен, но я получаю сообщение об ошибке поля не найдено.

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 структуры таким образом.

1 Ответ

5 голосов
/ 25 апреля 2019

Вы не можете получить доступ к tv_sec, потому что это поле не является открытым. Это называется видимостью, и вы можете прочитать об этом в главе 7.2 книги .

Вы можете вызывать только открытые методы для SystemTime, которые можно найти в API SystemTime.


Причина «странного» сообщения об ошибке i в том, что хотя отладочное представление предполагает, что оно является «плоской» структурой (например, имеет два поля tv_sec и tv_nsec), на самом деле является структура кортежа , что означает, что вы должны вызвать .0, чтобы получить внутреннее поле, которое затем приведет к ошибке

error[E0616]: field `0` of struct `std::time::SystemTime` is private
  --> src/main.rs:10:22
   |
10 |     println!("{:?}", time.0);
   |                      ^^^^^^

Это сделано для абстрагирования по разным ОС; Windows обрабатывает время иначе, чем Unix, например.


Если вы хотите получить «возраст» в секундах, вы можете преобразовать его в Duration, используя SystemTime::elapsed, который вернет вас Duration туда, где вы можно получить секунды, используя Duration::as_secs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...