私がどのように見える(機能といくつかのパラメータの膨張を除去した後)、いくつかの特徴があります:U
はFoo
とU
Boo
を実装を実装するいくつかのT
ためBar<T>
を実装した場合、1が可能な実装ネストされた形質
trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }
をU
のBaz
の実装を導出する。しかし、私はこれを行う有効なRustコードを書くことができませんでした。
少数の試みはあった:
impl<U: Bar<T> + Boo> Baz for U { }
収率
一方error: type name
T
is undefined or not in scope [E0412]
error: the type parameter
T
is not constrained by the impl trait, self type, or predicates [E0207]
を与える
impl<T: Foo, U: Bar<T> + Boo> Baz for U { }
(安定した)Rustでこれを行うことができましたか(うまくいけば動的ディスパッチなし)?
編集:一部の人々は、いくつかの同様の質問を示唆したがそのため基本的に2つのアプローチがあった(と私は私の状況のために、それらの両方が不適当見つける):
- 関連する型を使用します。
T
を追跡したいので、私はこれをしたくありません。私はU
とV
が同じT
ためBar<T>
を実装することを知ってほしいfn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
のような署名を持っているいくつかの関数を書きたいです。 (または関連する型でこれを行う方法がありますか?) U
とT
を構造体に入れて何らかのラッピングを使用しています。私はこのような「特性依存性」をいくつか持っているので、どちらも使いたくないので、各レベルで物をラップするとコードが大きく膨らんでしまいます。
したがって、更新される質問は次のようになります。関連するタイプまたはラッパーを使用せずにこの問題を解決する方法はありますか?
trait Foo { }
trait Boo { }
trait Bar {
type T: Foo;
}
trait Baz { }
impl<U: Bar + Boo> Baz for U
// this where clause is not necessary (this bound is already true)
// where U::T: Foo
{ }
I don't want to do this because I want to keep track of
T
, e.g. I want to write some functions which have a signature likefn bla<T: Foo, U: Bar<T>, V: Bar<T>>()
where I want to know thatU
andV
implementBar<T>
for the sameT
. (Or is there way of doing this with associated types?)
はい、あなたは、関連するタイプでそれを行うことができます: