Как работает возврат ссылки на Path из стека функции? - PullRequest
0 голосов
/ 14 декабря 2018

Следующий фрагмент взят из исходного кода ржавчины для path.rs

impl AsRef<Path> for String {
    fn as_ref(&self) -> &Path {
        Path::new(self)
    }
}

Кажется, что он возвращает ссылку на вновь созданный объект Path из фрейма стека.Как это обходит правила проверки заимствований Rust?У стекового объекта должно быть время жизни только для текущего кадра, и возвращение ссылки для временных объектов должно привести к ошибке.

1 Ответ

0 голосов
/ 14 декабря 2018

Возвращенная ссылка указывает не на какой-то объект, который был недавно создан внутри as_ref(), а скорее на данные строки, переданной в качестве аргумента.

Давайте сделаем время жизни всоответствующие функции в явном виде.Прототип

fn as_ref(&self) -> &Path

может быть переведен в

fn as_ref(&'a self) -> &'a Path

Тип self равен &'a String, ссылка на строку с временем жизни 'a.

Внутри тела функции вызывается Path::new().В соответствии с документацией это определяется следующим образом:

pub fn new<S: AsRef<OsStr> + ?Sized>(s: &S) -> &Path

Добавление указанного времени жизни дает

pub fn new<S: AsRef<OsStr> + ?Sized>(s: &'a S) -> &'a Path

, поэтому вновь созданная ссылка Path будет иметь то же время жизни, что и ссылкамы передали, что является точно необходимым временем жизни возвращаемого значения.

...