前提・実現したいこと
私はこれまでC言語とPerlを使って趣味でプログラムを作ってきました。Rustは初心者です。
構造体のフィールドに、別の構造体A又はBのポインタ(Box)を持たせたいと思い
コードを自作してみたのですが、コンパイルが通りませんでした。
エラーメッセージから、型注釈が必要、matchのアームが同じ型になっていない、というあたりを
汲み取ってネットで検索したり、書籍を頼ったりしたのですが、解決できません。
型を抽象化しないといけないのではと思いimpl Traitを調べたり、
トレイトオブジェクトを調べたり、クロージャを調べたり…したのですが、
コードがどんどん複雑になってエラーも増える一方で、手に負えませんでした。
Rustにおける定番の書き方のようなものがあれば、教えて頂けないでしょうか。
該当のソースコード
Rust
1fn main() { 2 let x = StructX::new( TypeA ); 3 let y = StructX::new( TypeB ); 4} 5 6enum EnumX { 7 TypeA, 8 TypeB, 9} 10use self::EnumX::*; 11 12struct StructA {} //StructXのフィールドに入れたい構造体A 13struct StructB {} //StructXのフィールドに入れたい構造体B 14 15struct StructX<T> { 16 box_pt: Box<T>, // Boxで StructA 又は StructB をくるみたい 17} 18 19impl<T> StructX<T> { 20 fn new( t: EnumX ) -> Self { 21 let pt = match t { 22 TypeA => Box::new( StructA {} ), 23 TypeB => Box::new( StructB {} ), 24 }; 25 StructX { 26 box_pt: pt, 27 } 28 } 29}
発生している問題・エラーメッセージ
error[E0282]: type annotations needed for `StructX<T>` --> src/main.rs:2:13 | 2 | let x = StructX::new( TypeA ); | - ^^^^^^^^^^^^ cannot infer type for type parameter `T` | | | consider giving `x` the explicit type `StructX<T>`, where the type parameter `T` is specified error[E0308]: match arms have incompatible types --> src/main.rs:23:22 | 21 | let pt = match t { | __________________- 22 | | TypeA => Box::new( StructA {} ), | | ---------------------- this is found to be of type `std::boxed::Box<StructA>` 23 | | TypeB => Box::new( StructB {} ), | | ^^^^^^^^^^^^^^^^^^^^^^ expected struct `StructA`, found struct `StructB` 24 | | }; | |_________- `match` arms have incompatible types | = note: expected type `std::boxed::Box<StructA>` found struct `std::boxed::Box<StructB>` error: aborting due to 2 previous errors Some errors have detailed explanations: E0282, E0308. For more information about an error, try `rustc --explain E0282`. error: could not compile `tmp2`. To learn more, run the command again with --verbose.
補足情報(FW/ツールのバージョンなど)
OS: Windows10 + WSL1 + Ubuntu
Rust:1.41.0
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/01 02:04