web-dev-qa-db-ja.com

トレイトは列挙型で使用できますか?

特性ドキュメント を読み、構造体で特性を使用するための適切な定義を見つけました。 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`

参照する列挙型が同じファイルにあるため、このエラーを理解できません。列挙型バリアントでトレイトを実際に使用できない場合、列挙型トレイトが特定のメソッドを実装する必要があることを保証できる方法はありますか?

6
Vergil

トレイトは列挙型で使用できますか?

はい。実際、列挙型にはすでに複数の特性が定義されています。特性 DebugCopy および 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() {}
}

参照:

8
Shepmaster