生涯エラーの一般的なパラメータ作ります

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()
    }
}

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377724&siteId=1