2017-12-12 10 views
0

私は1つのフィールドが他のフィールドの完全なスーパーセットであるいくつかのペアの構造体を持っています。いくつかの種類の継承をシミュレートしたいので、各構造体ごとに別々のケースを持つ必要がないので、コードがほぼ2倍になります。 Cのような言語で構図でのフィールド継承のシミュレーション

、私はこのようなものでフィールドの継承をシミュレートすることができます:私はルーストにこのような何かをしたい

struct A 
{ 
    int a; 
}; 

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

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

。私はそのようなものについてはhereを読んだが、私が試したときにまだ実装されていないようだ。別のケース処理をせずに別の内部構造体のフィールドを再利用する方法はありますか?ここで

は、私が試した列挙型の構文は次のとおりです。

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

「*ときIそれを試しました、それはまだ実装されていないようです* "あなたが試したことを分かち合う気に?あなたが遭遇したエラー? https://play.rust-lang.org/に入れて、他の人もそれを実行できるようにしてください。 – dimo414

答えて

2

enumの一般的なフィールドの構文は、Rust 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

関連する問題