2016-07-19 7 views
9

私がどのように見える(機能といくつかのパラメータの膨張を除去した後)、いくつかの特徴があります:UFooUBooを実装を実装するいくつかのTためBar<T>を実装した場合、1が可能な実装ネストされた形質

trait Foo { } 
trait Boo { } 
trait Bar<T: Foo> { } 
trait Baz { } 

UBazの実装を導出する。しかし、私はこれを行う有効な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つのアプローチがあった(と私は私の状況のた​​めに、それらの両方が不適当見つける):

  1. 関連する型を使用します。 Tを追跡したいので、私はこれをしたくありません。私はUVが同じTためBar<T>を実装することを知ってほしいfn bla<T: Foo, U: Bar<T>, V: Bar<T>>()のような署名を持っているいくつかの関数を書きたいです。 (または関連する型でこれを行う方法がありますか?)
  2. UTを構造体に入れて何らかのラッピングを使用しています。私はこのような「特性依存性」をいくつか持っているので、どちらも使いたくないので、各レベルで物をラップするとコードが大きく膨らんでしまいます。

したがって、更新される質問は次のようになります。関連するタイプまたはラッパーを使用せずにこの問題を解決する方法はありますか?

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 like fn bla<T: Foo, U: Bar<T>, V: Bar<T>>() where I want to know that U and V implement Bar<T> for the sameT . (Or is there way of doing this with associated types?)

はい、あなたは、関連するタイプでそれを行うことができます:

答えて

7

あなたはT関連付けられている型を作り、それを行うことができます

fn bla<U: Bar, V: Bar<T = U::T>>() { } 
関連する問題