rust - 当使用带有生存期说明符的函数时,借入的值的生命周期不足

标签 rust compiler-errors lifetime

我相当不熟悉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在该函数被调用之前就已经开始。这是正确的解释吗?
有没有不直接获取参数所有权的方法来解决此问题?

最佳答案

作为一般原则,对于&mut引用使用与其他任何参数一样的生命周期参数几乎总是一个错误。这是因为可变引用的生存期是不变的:与不可变引用不同,您不能使用比原始借项的实际生存期短的生存期来标记它(因为这会干扰验证是否没有重叠)。可变借贷)。
但是,您不需要该原理,因为这里存在一个更直接的问题:
在Serde中,Deserialize<'de>的意思是“反序列化为从具有生存期'de的数据中借用的结构”。

  • 反序列化的结果仅在生存期'de中有效。
  • 反序列化接受的输入必须在'de的整个生命周期内都有效。

  • 必须存在的输入不是reader;它是读取的字节。您不能使用比实际读取的字节还早的生命周期。
    如果要执行零复制反序列化,则必须将字节读入缓冲区并保留它们,直到完成该值为止。
    如果您只想要一个具有大约签名的函数,则使用DeserializeOwned而不是Deserialize<'de>-要求反序列化的值不能从输入中借用,因此其生存期与输入无关。

    关于rust - 当使用带有生存期说明符的函数时,借入的值的生命周期不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66202501/

    相关文章:

    rust - 使用rust 生命周期说明符的问题

    rust - 如果对象已被解构,是否有可能有一个短暂的 Rust 引用返回 None ?

    string - 在Rust中返回格式化的字符串

    rust - 为什么不能在同一结构中存储值和对该值的引用?

    javascript - 关于在 lambda 上保存图像

    haskell - Data.Map 的合格导入与 Prelude 冲突

    generics - 是否有约定将 ?Sized by 本身写为特征界限?

    rust - 使用 IntoIterator 特性编写通用特性实现,但仅适用于不可变引用实现者

    android studio 没有链接到缺少的资源

    ios - 如何修复Mac o链接器(id错误)