Возвращает ли тип с 'static сказать компилятору, что это значение не имеет ассоциированного времени жизни, или оно делает это значение статическим? - PullRequest
1 голос
/ 18 мая 2019

У меня есть перечисление с «частичным» временем жизни: один из его вариантов содержит заимствованную стоимость, а другой - владеющую стоимость.У меня есть функция, которая всегда возвращает перечисление с владельцем варианта.Чтобы осчастливить компилятор, я должен заявить, что время жизни возвращаемого перечисления равно 'static.

Мой вопрос о реальном времени жизни возвращаемого перечисления:

.что время жизни 'static, я просто направляю компилятору, что у перечисления нет времени жизни, или я на самом деле превращаю этот экземпляр в статический?

pub enum Sometimes<'a> {
    Own(u16),
    Borrow(&'a mut u16),
}

impl<'a> Sometimes<'a> {
    pub fn from_u16(data: u16) -> Sometimes<'static> {
        Sometimes::Own(data)
    }
}

1 Ответ

1 голос
/ 18 мая 2019

Это именно то, что кажется: вы говорите компилятору, что тип, возвращаемый from_u16, будет иметь время жизни 'static, связанное с ним. Это время жизни переносится самим типом перечисления, а не конкретным вариантом.

Тип Sometimes<'static> отличается от любого другого типа Sometime<'a>, если 'a не равен 'static. Например, вы не сможете вызвать / вернуть функцию fn foobar<'a>(foo: Sometime<'a>) -> ... со значениями, возвращаемыми из from_u16, если только 'a нельзя сделать равным 'static (компилятор будет кричать на вас за обещание общего времени жизни 'a, но используя конкретное время жизни 'static и не в состоянии доказать, что 'a на самом деле 'static).

Другим следствием является то, что вы не можете изменить значение вещи, возвращаемой from_u16 на Sometimes::Borrow(&mut u16), если эта ссылка не равна 'static (что может быть тем, что вы хотите). Рассмотрим функцию foobar, как указано выше, где компилятор вычислил, что 'a равно 'static, поскольку было передано то, что было возвращено из from_u16. Теперь какой-то код где-то изменяет значения, чтобы быть Sometimes::Borrow. Это безопасно, только если время жизни, связанное с Sometimes::Borrow, все еще равно 'static, в противном случае foobar теперь обрабатывает то, что, как предполагалось, было временем жизни 'static, но на самом деле является висячей ссылкой. Это весло.

Так что нет, вы не можете указать компилятору, что существует вариант enum, где время жизни не имеет значения. Возвращенный экземпляр не является 'static сам по себе, он просто имеет ассоциированное время жизни 'static, куда бы он ни шел, и компилятор будет жаловаться, если вы попытаетесь вернуть какое-то общее время жизни, но на самом деле вернет 'static.

...