我对 Rust 的生命周期相当陌生。这是我写的代码:
pub fn from_reader<'de, T, R>(reader: &'de mut R) -> Result<T>
where
T: Deserialize<'de>,
R: Read,
{
let mut reader = BufReader::new(reader);
from_buf_reader(&mut reader)
}
pub fn from_buf_reader<'de, T, R>(reader: &'de mut R) -> Result<T>
where
T: Deserialize<'de>,
R: BufRead,
{
//...
}
我收到以下错误:
error[E0597]: `reader` does not live long enough
--> src/de.rs:34:21
|
28 | pub fn from_reader<'de, T, R>(reader: &'de mut R) -> Result<T>
| --- lifetime `'de` defined here
...
34 | from_buf_reader(&mut reader)
| ----------------^^^^^^^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `reader` is borrowed for `'de`
35 | }
| - `reader` dropped here while still borrowed
根据我的理解,新创建的
reader
需要具有 'de
生命周期,这是不可能的,因为 'de
甚至在调用此函数之前就开始了。这是正确的解释吗?
有没有办法解决这个问题而不直接获取参数的所有权?
在 Serde 中,
Deserialize<'de>
表示“反序列化为一个结构,该结构 从生命周期为 'de
的数据中借用。”
'de
。'de
。必须存在的输入不是
reader
;它是读取的字节。 您不能使用早于实际读取的字节的生命周期。
如果您尝试执行零拷贝反序列化,则必须将字节读入缓冲区并保留它们,直到完成该值。如果您只想要一个与您拥有的签名大致相同的函数,请使用
DeserializeOwned
而不是
Deserialize<'de>
— 这要求反序列化值不借用输入,因此其生命周期与输入无关。