使用带有生命周期说明符的函数时,借用的值寿命不够长

问题描述 投票:0回答:1

我对 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
甚至在调用此函数之前就开始了。这是正确的解释吗?

有没有办法解决这个问题而不直接获取参数的所有权?

rust compiler-errors lifetime
1个回答
3
投票

在 Serde 中,

Deserialize<'de>
表示“反序列化为一个结构,该结构 从生命周期为
'de
的数据中借用。

  1. 反序列化的结果仅在生命周期内有效
    'de
  2. 反序列化采用的输入必须在生命周期内有效
    'de

必须存在的输入不是

reader
;它是读取的字节。 您不能使用早于实际读取的字节的生命周期。

如果您尝试执行零拷贝反序列化,则必须将字节读入缓冲区并保留它们,直到完成该值。

如果您只想要一个与您拥有的签名大致相同的函数,请使用

DeserializeOwned

而不是

Deserialize<'de>
— 这要求反序列化值不借用输入,因此其生命周期与输入无关。
    

© www.soinside.com 2019 - 2024. All rights reserved.