特性ドキュメント を読み、構造体で特性を使用するための適切な定義を見つけました。 enum
タイプで特性を使用することは可能ですか? 「いいえ」と答える回答を見たことがありますが、それらは3歳であり、私がやろうとしていることを完全には実行していません。
私はこれをやろうとしました:
#[derive(Debug, Copy, Clone)]
pub enum SceneType {
Cutscene,
Game,
Menu,
Pause,
Credits,
Exit,
}
//We want to guarantee every SceneType can be played statically
trait Playable {
fn play();
}
impl Playable for SceneType::Cutscene {
fn play() {}
}
error[E0573]: expected type, found variant `SceneType::Cutscene`
--> src/main.rs:16:19
|
16 | impl Playable for SceneType::Cutscene {
| ^^^^^^^^^^^^^^^^^^^
| |
| not a type
| help: you can try using the variant's enum: `SceneType`
参照する列挙型が同じファイルにあるため、このエラーを理解できません。列挙型バリアントでトレイトを実際に使用できない場合、列挙型トレイトが特定のメソッドを実装する必要があることを保証できる方法はありますか?
トレイトは列挙型で使用できますか?
はい。実際、列挙型にはすでに複数の特性が定義されています。特性 Debug
、 Copy
および Clone
:
#[derive(Debug, Copy, Clone)] pub enum SceneType
問題は、列挙型にPlayable
を実装しようとしているのではなく、列挙型のバリアントの1つに実装しようとしていることです。列挙型バリアントはタイプではありません。
エラーメッセージが示すように:
help: you can try using the variant's enum: `SceneType`
impl Playable for SceneType {
fn play() {}
}
参照: