2017-12-12 36 views
0

하나의 필드가 다른 것의 완벽한 수퍼 세트 인 여러 쌍의 구조체가 있습니다. 어떤 종류의 상속을 시뮬레이션하고 싶습니다. 그래서 각 코드를 두 배로 늘릴 수 있기 때문에 각각의 구조체에 대해 별도의 사례를 가질 필요가 없습니다. C와 같은 언어에서 컴포지션을 사용한 필드 상속 시뮬레이션

,이 같은 뭔가 필드의 상속을 시뮬레이션 할 수 있습니다 :

struct A 
{ 
    int a; 
}; 

struct B 
{ 
    struct A parent; 
    int b; 
}; 

main() 
{ 
    struct B test1; 
    struct A *test2 = &test1; 
    test2->a = 7; 
} 

내가 녹이 같은 일을하고 싶다. 나는 그와 같은 것을 읽었습니다. here 그러나 그것을 시도했을 때 아직 구현되지 않은 것처럼 보입니다. 별도의 케이스 처리없이 다른 내부의 struct에서 필드를 재사용 할 수있는 방법이 있습니까? 여기

내가 시도 열거 구문입니다

enum Top 
{ 
    a: i32, 
    A {}, 
    B { 
     b: i32 
    } 
} 

그리고 이것은 내 오류입니다 : 일부 샘플 실행에

error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:` 
--> src/main.rs:3:6 
    | 
3 |  a: i32, 
    | ^expected one of `(`, `,`, `=`, `{`, or `}` here 

Link.

+0

"* 때 내가 시도했지만, 아직 구현되지 않은 것 같습니다. * "당신이 시도한 것을 공유하도록 신경을 씁니까? 당신이 만난 오류들? https://play.rust-lang.org/에 올려 놓으십시오. 다른 사람들도 실행할 수 있습니다. – dimo414

답변

2

열거 형의 일반 필드에 대해 제안 된 구문은 녹 1.22에서 구현되지 않았습니다. 지금 당장 유일한 선택은 평범한 구도입니다. 당신이 A를 포함하는 여러 유형에 일반적으로 작동 할 수 있도록하려면, 당신은 그 모든 유형에서 해당 A에 대한 액세스를 제공하는 특성을 정의하고 그것을 구현 할 수 있습니다 :

trait HaveA { 
    fn a(&self) -> &A; 
    fn a_mut(&mut self) -> &mut A; 
} 

impl HaveA for B { 
    fn a(&self) -> &A { 
     &self.parent 
    } 

    fn a_mut(&mut self) -> &mut A { 
     &mut self.parent 
    } 
} 
+0

문제를 해결할 수 있기 때문에 투표를 끝냈습니다.하지만 더 나은 방법이 있어야하기 때문에 해결 방법을 선택했습니다. 나는 시스템 프로그래밍 언어에 대한 더 엄격한 통제를 기대하고 있었다. – user2752635