Возвращенная ссылка указывает не на какой-то объект, который был недавно создан внутри 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
будет иметь то же время жизни, что и ссылкамы передали, что является точно необходимым временем жизни возвращаемого значения.