簡體   English   中英

為什么 Rust 需要此變量的“靜態”生命周期?

[英]Why does Rust require a `'static` lifetime for this variable?

我試圖理解為什么 Rust 使類型具有'static生命周期”。

請看一下這段代碼:

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

VSCode 告訴我tcp_tx_buffer的類型是

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

但是如果我們在RingBuffer上找到new 方法

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 ,但它有自己的 scope。 或者 Rust 是否認為main具有'static壽命”?

new上的簽名表示它返回一個帶有特定生命周期的RingBuffer 當調用Into<ManagedSlice>時,它被定義為與storage參數作為ManagedSlice的一部分返回的生命周期相同。 也就是說, storage參數決定了RingBuffer值所承載的生命周期。

您將擁有的Vec傳遞給TcpSocketBuffer::new() 不包含引用類型的擁有的Vec本身就是'static TcpSocketBuffer可以(由於其實現) Into<ManagedSlice> ,其中ManagedSlice攜帶生命周期原始Vec的生命周期'static 這就是'static的來源。

在考慮'static這一生命周期並不意味着該值必須永遠存在時,這可能會有所幫助。 這只是意味着可以使價值永遠存在。 這適用於所有不包含自身生命周期短於'static的引用的值。 例如,一個String::new()'static ,因為它可以活到我們想活多久(只需不丟棄它)。 Foo<'a> { bar: &'a str }只能與'a a 一樣長,因為Foo包含的引用可能'static短。

從創建的那一刻起,您擁有的Vec就可以隨心所欲地存在,並且這個屬性被傳遞到RingBuffer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM