2017-01-15 13 views
3

どのように私は、この作品のようなものにすることができます:私は、Sが特色である必要がありますコンパイラに伝えるために、いくつかのタイプのマーカーを探し、このパターンの一部例えば錆のドキュメントを検索し、できませんでした1つのジェネリック型がRustに別のジェネリック型を実装するという制約を追加するには?

struct FooStruct<A, B> where A : B, B : ?Sized {...} 

を同じ問題を抱えている他の人を見つける。ここに私のコードは次のとおりです。

trait Factory<S> where S : ?Sized { 
    fn create(&mut self) -> Rc<S>; 
} 

trait Singleton<T> { 
    fn create() -> T; 
} 

struct SingletonFactory<T> { 
    instance: Option<Rc<T>> 
} 

impl<S, T> Factory<S> for SingletonFactory<T> where S : ?Sized, T : S + Singleton<T> { 
    fn create(&mut self) -> Rc<S> { 
     if let Some(ref instance_rc) = self.instance { 
      return instance_rc.clone(); 
     } 
     let new_instance = Rc::new(T::create()); 
     self.instance = Some(new_instance.clone()); 
     new_instance 
    } 
} 

コンパイラは次のエラーで失敗します。

 --> src/lib.rs:15:57 
    | 
15 | impl<S, T> Factory<S> for SingletonFactory<T> where T : S + Singleton<T> { 
    |              ^not a trait 

答えて

4

私は答えを見つけるために管理:std::marker::Unsize<T> trait、錆の現在のバージョンではないが、安定した特徴(1.14 .0)。動的サイズの型に「無サイズ」することができ

pub trait Unsize<T> where T: ?Sized { } 

タイプ。

これは、 "実装"の意味よりも広いですが、サンプルコードの汎用パラメータは構造体と1つまたは2つ以上のものである可能性があるため、最初から検索していたはずです形質(大きさとサイズの決められていない配列など)。問題の

一般的な例を書くことができます。

struct FooStruct<A, B> 
    where A: Unsize<B>, 
      B: ?Sized, 
{ 
    // ... 
} 

そして、私のコード:

impl<S, T> Factory<S> for SingletonFactory<T> 
    where S: ?Sized, 
      T: Unsize<S> + Singleton<T>, 
{ 
    // ... 
} 
+0

私は 'Unsize'の認識していなかった、それは確かに新たな扉を開きます! –

+0

はい、それは深く文書に隠されていました:)このRFCはhttps://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.mdに関するいくつかの情報を提供しています。あなたの助けをたくさんありがとう:) – Gdow

+0

'Unsize'を掘り起こしてくれてありがとう、広告を無料で楽しむ;) –

関連する問題