【问题标题】:Borrow Checker not releasing borrow from FnOnce callback借用检查器未从 FnOnce 回调中释放借用
【发布时间】:2023-01-25 17:29:22
【问题描述】:

为什么编译:

fn func<T>(
  callback: impl FnOnce(&mut i64) -> T,
) -> T {
    let v = 42;
    callback(&mut 42)
}

但这不是吗?:

fn func<'a, T>(
  callback: impl FnOnce(&'a mut i64) -> T,
) -> T {
    let v = 42;
    callback(&mut 42)
}

即使这样也无法编译:

fn func<'a, T: 'static>(
  callback: impl FnOnce(&'a mut i64) -> T,
) -> T {
    let v = 42;
    callback(&mut 42)
}

有没有办法告诉 Rust 从 callback 返回的 T 不包含对 'a 的任何引用?我以为 : 'static 一般会禁止引用,但它似乎不起作用。不幸的是,我确实需要给'a一个名字,因为我在其他地方使用了生命周期,实际代码比这个最小的例子要复杂一些。

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    在您的第一个 sn-p 中,通过 Higher-Ranked Trait Bounds 省略了生命周期:

    fn func<T>(
      callback: impl for<'a> FnOnce(&'a mut i64) -> T,
    ) -> T {
        let v = 42;
        callback(&mut 42)
    }
    

    这意味着闭包可以在任何生命周期内调用,包括 v 的生命周期。

    在您的第二个 sn-p 中,生命周期由调用者选择。这个和T没有关系:比如调用者可以选择'static,然后把参数存入一个static。只是没有办法用函数中定义的变量来满足这个要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多