2017-01-15 11 views
3

Как я могу сделать что-то вроде этой работы:Как добавить ограничение, что один родовой тип реализует другой родовой тип в Rust?

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

Я искал какой-то тип маркера, чтобы сообщить компилятору, что S должна быть черта, искали документацию Rust для некоторого примера этой модели, так и не смог найти других людей, имеющих ту же проблему. Вот мой код:

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, хотя и не стабильная функция в текущей версии Rust (1.14 +0,0).

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

Типы, которые могут быть «несортированный» к типу динамического размера.

Это шире, чем «инвентарь» смысловой, но это то, что я должен искал с самого начала, так как общие параметры в коде примера могут быть другими вещи, чем структуры и признак или два (например, размерные и нестандартные массивы).

Родовой пример в вопросе может быть написан:

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', наслаждайтесь SO ad-free;) –