1

編集者注: 質問に示されているコードは、Rust 1.0 でそのままコンパイルされます。

私はもう試した:

trait Inner {}

struct Outer<'a> {
    inner: &'a Inner,
}

しかし、コンパイラは文句を言います:

   Compiling tst v0.1.0 (file:///home/chris/rust/tst)
/home/chris/rust/tst/src/main.rs:4:14: 4:19 error: explicit lifetime bound required
/home/chris/rust/tst/src/main.rs:4   inner: &'a Inner,
4

2 に答える 2

6

トレイトを実装するものへの参照を含む構造体が必要であることを Rust に伝えるにはどうすればよいですか?

2 つの方法があります。まず、ジェネリックを使用することをお勧めします。

struct Outer<'a, T> {
    inner: &'a T,
}

impl<'a, T: Inner> Outer<'a, T> {
    // ...
}

この方法は、すべての関数呼び出しが静的にディスパッチされるため、最も効率的です。これは最も型安全でもありますが、その欠点は、使用するすべての場所で特性バインドを指定する必要があり、事前に知る必要があるため、異なる時間に同じ構造でのOuter<T>異なる実装を保持できないことです。.InnerT

もう 1 つの方法は、特性オブジェクトを使用することです。

struct Outer<'a> {
    inner: &'a (Inner + 'a),
}

これはあなたがすでに試したことであり、表示されるエラーは、有効期間の境界を指定していないことが原因+ 'aです。ライフタイム パラメーター ( など) を持つ構造体に対してトレイトを実装できるため、ライフタイム バウンドを指定する必要がありますOuter。また、そのような構造体をトレイト オブジェクトにボックス化する場合は、トレイト オブジェクト型でそのライフタイム パラメーターを指定する方法が必要です。

特性オブジェクトの利点は、アノテーションの量が少ないことと、境界を満たしている限り、任意の型をinner同じ値のフィールドとして使用できることです。欠点は、代わりに動的ディスパッチを取得することであり、効率がわずかに低下する可能性があります。また、機械を追加しないと、特性オブジェクトの元の型を取得することはできません。OuterInner

于 2014-10-14T15:48:42.363 に答える