Ваша проблема не с самим Option
, а с временными кодами, которые создает ваш код.Ваша основная строка довольно длинная, поэтому давайте разберем ее немного:
let temp: PathBuf = conicalize(PathBuf::from(filename)).unwrap();
let filename: &str = temp.to_str();
И теперь ваш более поздний код, использующий filename
, просто работает.Вы можете быть удивлены, почему запись временной переменной имеет значение.Ответ заключается в том, что временные файлы, созданные компилятором, уничтожаются в конце предложения, которое его содержит.
Обратите внимание, что filename
на самом деле является ссылкой, поэтому он должен иметь ассоциированное время жизни, которое, очевидно, 1 , переменной temp
.Это означает, что filename
не может пережить temp
.Но в вашем коде temp
на самом деле не именованная переменная, а временная, которая уничтожается после завершения строки, а filename
становится непригодным для использования.
Если вы прочитаете полную ошибку компилятора, выВы увидите:
примечание: рассмотрите возможность использования привязки let
для создания более долгоживущего значения.
, которое предполагает именно это.
[1]: Очевидно, если вы прочитаете определение функции PathBuf
: fn to_str<'a>(&'a self) -> Option<&'a str>
(для ясности добавляем ожидаемое время жизни).