2017-01-15 9 views
3

어떻게이 작품과 같이 할 수 있습니다 : 나는 S이 특성해야 컴파일러에게 몇 가지 유형의 마커를 검색하나의 제네릭 형식이 녹의 다른 제네릭 형식을 구현하는 제약 조건을 추가하는 방법은 무엇입니까?

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

는,이 패턴의 몇 가지 예를 들어 녹 문서를 검색을, 그리고 수 같은 문제가있는 다른 사람들을 찾으십시오.

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

답변

4

내가 대답을 찾기 위해 관리 : 컴파일러는 다음과 같은 오류와 함께 실패

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

다음 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에 관한 몇 가지 정보를 제공합니다. 도와 주셔서 대단히 감사합니다. – Gdow

+0

'Unsize'를 파헤쳐 주셔서 다시 한번 감사 드리며, 광고가 없다면 무료입니다;) –