enums - 返回具有 'static tell the compiler this value doesn' t 的类型是否具有关联的生命周期,或者它是否使该值静态?

标签 enums rust lifetime

我有一个具有“部分”生命周期的枚举:它的一个变体包含一个借来的值,另一个包含一个拥有的值。我有一个函数,它总是返回一个带有所属变体的枚举。为了让编译器满意,我必须声明返回枚举的生命周期是'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/

相关文章:

rust - 预期为 std::iter::Iterator,但找到了 std::iter::Iterator

rust - 为什么我的特征需要生命周期参数?

immutability - 在以下方法实现中,可变性如何影响 `self` 的生命周期?

java - 编写构造函数,从不同的类获取枚举参数

ios - 如何将 NSNotification.Name 重新定义为枚举?

process - 我如何等待标准输出已通过管道传输到另一个的 Rust `Child` 进程?

rust - From 特征实现的生命周期

swift - 快速检查错误变量是否不是某个错误的特定情况

c# - 在枚举中表示项目状态的优雅方式

rust - 如何在rust中返回带有引用的结构?