【问题标题】:Does returning a type with 'static tell the compiler this value doesn't have an associated lifetime or does it make that value static?返回带有 'static 的类型是否告诉编译器该值没有关联的生命周期,或者它是否使该值成为静态?
【发布时间】:2019-05-18 11:39:25
【问题描述】:

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

【问题讨论】:

    标签: enums rust lifetime


    【解决方案1】:

    看起来就是这样:您告诉编译器from_u16 返回的类型将具有与之关联的'static 的生命周期。这个生命周期是由枚举类型本身携带的,而不是特定的变体。

    Sometimes&lt;'static&gt; 类型不同于任何其他类型Sometime&lt;'a&gt;,除非'a 是'static。例如,您可能无法使用从 from_u16 返回的值从函数 fn foobar&lt;'a&gt;(foo: Sometime&lt;'a&gt;) -&gt; ... 调用/返回,除非可以将 'a 设置为 'static(编译器会因为承诺通用生命周期而对您大喊大叫 @ 987654331@ 但使用特定的生命周期 'static 并且无法证明 'a 实际上是 'static)。

    另一个后果是您不能将from_u16 返回的事物的值更改为Sometimes::Borrow(&amp;mut u16),除非该引用是'static(这可能是您想要的)。考虑上面的函数foobar,其中编译器认为'a 是'static,因为它传递了从from_u16 返回的内容。现在,某处的某些代码将值更改为Sometimes::Borrow。仅当与 Sometimes::Borrow 关联的生命周期始终为 'static 时,这才是安全的,否则 foobar 现在处理它应该是 'static 生命周期但实际上是一个悬空引用。那是划桨。

    所以不,您不能指导编译器存在一个生命周期无关紧要的枚举变体。返回的实例本身不是'static,它只是携带'static 的关联生命周期,如果您尝试返回一些通用生命周期但实际上返回'static,编译器会抱怨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2011-05-28
      • 2023-03-05
      • 2019-12-27
      相关资源
      最近更新 更多