我有一个具有“部分”生命周期的枚举:它的一个变体包含一个借来的值,另一个包含一个拥有的值。我有一个函数,它总是返回一个带有所属变体的枚举。为了让编译器满意,我必须声明返回枚举的生命周期是'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)
}
}
最佳答案
它看起来就是这样:你告诉编译器 from_u16
返回的类型生命周期为 'static
与之相关。此生命周期由枚举类型本身携带,而不是特定变体。
类型Sometimes<'static>
不同于任何其他类型 Sometime<'a>
除非'a
是'static
.例如,您可能无法从函数中调用/返回 fn foobar<'a>(foo: Sometime<'a>) -> ...
使用从 from_u16
返回的值除非'a
可以做成'static
(编译器会因为 promise 通用生命周期 'a
而使用特定生命周期 'static
并且无法证明 'a
实际上是 'static
而对您大喊大叫)。
另一个结果是您无法更改 from_u16
返回的值。至 Sometimes::Borrow(&mut u16)
除非该引用是 'static
(这可能是你想要的)。考虑一个函数 foobar
如上所述,编译器认为 'a
是'static
当它通过时,从 from_u16
返回的内容.现在某处的一些代码将值突变为 Sometimes::Borrow
.仅当与 Sometimes::Borrow
关联的生命周期时,这才是安全的还是'static
一直以来,不然foobar
现在处理它认为的 'static
lifetime 但实际上是一个悬空引用。那是划桨。
所以不,您不能引导编译器存在生命周期无关紧要的枚举变体。返回的实例不是 'static
就其本身而言,它只带有一个关联的生命周期 'static
无论它走到哪里,如果您尝试返回一些通用生命周期但实际上返回 'static
,编译器都会提示.
关于enums - 返回具有 'static tell the compiler this value doesn' t 的类型是否具有关联的生命周期,或者它是否使该值静态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56198573/