Как преобразовать std :: Option <& str> в & str в Rust - PullRequest
1 голос
/ 21 сентября 2019

Я недавно использовал ржавчину и обнаружил, что тип std::option::Option несколько сбивает с толку, когда дело доходит до определения времени жизни переменных.Я новичок в этом языке, поэтому я прошу прощения, если это просто исправить.Я пытался извлечь базовое значение из Some внутри шаблона сопоставления параметров следующим образом:

    let filename = match canonicalize(&PathBuf::from(filename)).unwrap().to_str() {
        Some(path) => path,
        _ => "",
    };

    // Later, I validate the string content 
    if filename.is_empty() {
       do_something();
    }

Однако это приводит к следующей ошибке:

temporary value dropped while borrowed: borrow later used here 

Документацияне дает большого понимания того, как сохранить продолжительность жизни вне рамок вызова, в котором они инициализированы. Я видел примеры здесь и здесь .Оба примера подразумевают либо выбрасывание значения, либо преобразование в тип Option, ни того, ни другого.Я просто хочу получить значение &str, как только функция завершится успешно.Любые другие общие советы по работе с std :: option приветствуются.

1 Ответ

2 голосов
/ 21 сентября 2019

Ваша проблема не с самим 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> (для ясности добавляем ожидаемое время жизни).

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