[英]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_buffer
在main
之外,我猜它是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.