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