You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为HRTB添加生命周期边界?Rust泛型结构体报错排查

结构体泛型参数与HRTB的生命周期不匹配问题

问题代码

以下代码尝试为结构体Foo的泛型参数指定具体类型,但无法正常编译:

struct Foo<'a, T: 'a, K: 'a, F>
where
    for<'r> F: Fn(&'r T) -> K,
{
    t: &'a T,
    k: K,
    f: F,
}

impl<'a, T: 'a> Foo<'a, T, &'a T, for<'r> fn(&'r T) -> &'r T> {
    //
}

编译报错信息

编译时触发类型不匹配错误,具体信息如下:

error[E0308]: mismatched types
  --> src/lib.rs:10:17
   |
10 | impl<'a, T: 'a> Foo<'a, T, &'a T, for<'r> fn(&'r T) -> &'r T> {
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
   |
   = note: expected associated type `<for<'r> fn(&'r T) -> &'r T as FnOnce<(&T,)>>::Output`
              found associated type `<for<'r> fn(&'r T) -> &'r T as FnOnce<(&'r T,)>>::Output`
note: the required lifetime does not necessarily outlive the lifetime `'a` as defined here
  --> src/lib.rs:10:6
   |
10 | impl<'a, T: 'a> Foo<'a, T, &'a T, for<'r> fn(&'r T) -> &'r T> {
   |      ^^
note: the lifetime requirement is introduced here
  --> src/lib.rs:3:29
   |
3  |     for<'r> F: Fn(&'r T) -> K,
   |                             ^

对比可行代码

当函数返回引用而非直接返回K时,代码可以正常编译运行:

struct Foo<'a, T: 'a, K: 'a, F>
where
    for<'r> F: Fn(&'r T) -> &'r K,
{
    t: &'a T,
    k: K,
    f: F,
}

impl<'a, T: 'a> Foo<'a, T, T, for<'r> fn(&'r T) -> &'r T> {
    //
}

此时K的类型未绑定到特定生命周期,因此能满足编译要求。

疑问

在返回K而非&'r K的情况下,如何实现类似的编译通过效果?


内容的提问来源于stack exchange,提问作者Boiethios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:35:51