Tavianバーンズ:
私は、次のコードに私の問題を低減しました:
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>
パラメータとして?
ロドリゴ:
:次のようなジェネリック型を書くとき
struct Foo<'a, T> {
a: &'a T,
}
錆は自動的にタイプの暗黙の制限を追加T: 'a
するご参照ので、T
ないライブよりも長く缶T
そのもの。あなたのタイプは、それなしで動作しないので、これは自動的に行われます。
しかし、あなたのような何かを行うとき:
impl<T> Foo {
fn bar<'a, 'b>() -> &'a T {/*...*/}
}
自動存在しT: 'a
なくT: 'b
一切ありませんので、&'b T
どこでも。
解決策は、自分でこれらの制約を追加することです。あなたのコードでは、このようなものになるだろう。
impl<T> Confused<T> {
fn bar<'a, 'b, U: Trait<'a, 'b, T>>(&'a self, param: &U) -> &'a T
where
T: 'b, //<--- here!
{
param.b();
param.a()
}
}