gpt4 book ai didi

rust - 为什么Rust要求此变量的 `'静态生命周期?

转载 作者:行者123 更新时间:2023-12-03 11:45:35 24 4
gpt4 key购买 nike

我试图理解为什么Rust使类型具有'static生存期。

请看看this代码:

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

VSCode告诉我 tcp_tx_buffer的类型是
smoltcp::storage::RingBuffer<'static, u8>

但是,如果我们在 new上找到 RingBuffer 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生存期?

最佳答案

new上的签名表示,它返回一个带有特定生存期的RingBuffer;它被定义为与调用storageManagedSlice -parameter作为Into<ManagedSlice>的一部分返回的内容所携带的生命周期相同。就是说,storage -parameter决定了RingBuffer -value所携带的生存期。

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

考虑'static时,这个生存期并不意味着该值必须永远存在,这可能会有所帮助。这只是意味着可以使值(value)永远存在。对于所有不包含其生存期短于'static的引用的值,这都是正确的。例如,String::new()之所以是'static,是因为它可以根据需要保留(只要不丢弃即可)。 Foo<'a> { bar: &'a str }的生存期只能与'a一样长,因为Foo包含的引用可能比'static短。

从创建的那一刻起,您可以将自己拥有的Vec保留到我们想要的生命周期之内,并且将此属性传递给RingBuffer

关于rust - 为什么Rust要求此变量的 `'静态生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61724455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com