如何为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
相关产品推荐
相关产品推荐

