【发布时间】:2020-03-31 14:49:30
【问题描述】:
我已将问题简化为以下代码:
struct Struct<'a, 'b, T> {
a: &'a T,
b: &'b T,
}
trait Trait<'a, 'b, T> {
fn a(&self) -> &'a T;
fn b(&self) -> &'b T;
}
impl<'a, 'b, T> Trait<'a, 'b, T> for Struct<'a, 'b, T> {
fn a(&self) -> &'a T {
self.a
}
fn b(&self) -> &'b T {
self.b
}
}
struct Confused<T> {
field: T,
}
impl<T> Confused<T> {
fn foo<'a, 'b>(&'a self, param: &Struct<'a, 'b, T>) -> &'a T {
param.b();
param.a()
}
fn bar<'a, 'b, U: Trait<'a, 'b, T>>(&'a self, param: &U) -> &'a T {
param.b();
param.a()
}
}
函数foo 没问题,但是当我将具体类型Struct<'a, 'b, T> 替换为泛型类型U: Trait<'a, 'b, T> 时,出现以下错误:
error[E0309]: the parameter type `T` may not live long enough --> src/lib.rs:31:15 | 24 | impl<T> Confused<T> { | - help: consider adding an explicit lifetime bound `T: 'b`... ... 31 | param.b(); | ^ | note: ...so that the reference type `&'b T` does not outlive the data it points at --> src/lib.rs:31:15 | 31 | param.b(); | ^
添加绑定T: 'b 的建议对我来说没有意义,因为'b 是bar() 的参数。如何修复 bar() 以接受 Trait<'a, 'b, T> 的任何实现作为参数?
【问题讨论】:
-
您的问题是什么?到目前为止,您只陈述了事实。
-
我已经明确添加了我的问题
-
您说编译器建议的界限对您来说没有意义,但是是什么阻止您添加它,即使您不理解它?
-
将
'b作为生命周期参数添加到Confused会更改代码的含义。foo()和bar()在两个生命周期中都是通用的。为什么foo()可以,bar()不行? -
为什么要将约束添加到
Confused而不是bar?
标签: rust