2017-01-15 152 views
3

我怎樣才能讓這樣的工作:如何添加約束一個泛型類型實現了鏽另一個泛型類型?

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

我搜索了某種類型的標記告訴編譯器S必須是一個特點,搜索這種模式的一些例子鏽文件,並不能發現有同樣的問題其他人。這裏是我的代碼:

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 { } 

類型,可以是「未施膠」發送給動態大小的類型。

這比「implements」語義更廣泛,但它是我應該從頭開始搜索的內容,因爲示例代碼中的泛型參數可以是除結構和特徵或兩個以外的其他內容性狀(比如大小和未分級陣列)。

的問題通用例子可以寫成:

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。感謝挖'Unsize'很多關於你的幫助:)再次感謝 – Gdow

+0

,SO享受無廣告) –

相關問題