【问题标题】:Why does Rust require a `'static` lifetime for this variable?为什么 Rust 需要这个变量的“静态”生命周期?
【发布时间】:2023-04-11 00:59:01
【问题描述】:

我试图理解为什么 Rust 让一个类型拥有 'static 生命周期。

请看this代码:

let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; 128]);

VSCode告诉我tcp_tx_buffer的类型是

smoltcp::storage::RingBuffer<'static, u8>

但如果我们在RingBuffer 上找到new method

pub fn new<S>(storage: S) -> RingBuffer<'a, T>
    where S: Into<ManagedSlice<'a, T>>,
{
    RingBuffer {
        storage: storage.into(),
        read_at: 0,
        length:  0,
    }
}

返回时没有'static 生命周期。事实上,生命周期与输入 'a 相同。如果let tcp_tx_buffermain 之外,我猜它是static,但它有自己的范围。或者 Rust 是否认为 main 具有 'static 生命周期?

【问题讨论】:

  • 因为生命周期无关紧要,ManagedSlice 基本上是一头牛,如果值是借用(实际切片),生命周期就在那里。由于您给它一个拥有的值,因此对象没有无效的生命周期,因此它可以获得“最宽”的可能生命周期,即'static
  • 很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在一个全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!

标签: rust


【解决方案1】:

new 上的签名表示它返回一个带有特定生命周期的RingBuffer;当调用Into&lt;ManagedSlice&gt; 时,它被定义为与storage-参数作为ManagedSlice 的一部分返回的任何生命周期相同。也就是说,storage-参数决定了RingBuffer-value所承载的生命周期。

您将拥有的Vec 传递给TcpSocketBuffer::new()。不包含引用类型的拥有的Vec 本身就是'staticTcpSocketBuffer 可以(由于其实现)Into&lt;ManagedSlice&gt;,其中ManagedSlice 带有生命周期原始Vec 的生命周期'static。这就是'static 的来源。

在考虑'static 时可能会有所帮助,这一生命周期并不意味着价值必须永远存在。这只是意味着价值可以使永远存在。这适用于所有不包含自身生命周期短于'static 的引用的值。例如,String::new()'static,因为它可以活到我们想活多久(只需不丢弃它)。 Foo&lt;'a&gt; { bar: &amp;'a str } 只能与'a 一样长,因为Foo 包含一个可能短于'static 的引用。

从创建的那一刻起,您所拥有的Vec 就可以让我们随心所欲地活下去,并且此财产将转移到RingBuffer

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 2016-10-09
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多