我试图理解为什么 Rust 使类型具有'static
生命周期。
请看一下这段代码:
let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; 128]);
VSCode 告诉我的类型tcp_tx_buffer
是
smoltcp::storage::RingBuffer<'static, u8>
但是,如果我们找到new
方法上RingBuffer
:
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
,但它有自己的范围。或者 Rust 认为main
有一个'static
生命周期?
签名new
说它返回一个RingBuffer
带有特定生命周期的;它被定义为与作为when调用的storage
一部分的-parameter 返回的任何内容所携带的生命周期相同。也就是说,-parameter 决定了 -value 携带的生命周期。ManagedSlice
Into<ManagedSlice>
storage
RingBuffer
您正在传递一个拥有的Vec
到TcpSocketBuffer::new()
. 一个Vec
不包含引用类型的拥有者是它自己'static
。TcpSocketBuffer
can(由于它的实现)Into<ManagedSlice>
,其中ManagedSlice
包含生命周期原件Vec
的生命周期'static
。这是'static
从哪里来的。
考虑'static
到这一生并不意味着价值必须永远存在,这可能会有所帮助。它只是意味着该值可制成能长生不老。对于不包含自身生命周期短于 的引用的所有值都是如此'static
。例如, aString::new()
是'static
因为它可以随心所欲地存活(只需不丢弃它)。AFoo<'a> { bar: &'a str }
只能存活多久'a
,因为它Foo
包含的引用可能比'static
.
从创建的那一刻起,您拥有的Vec
财产就可以随我们的需要而活,并且此财产将一直延续到RingBuffer
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句