開発

[binllion] enumで書いてみる

またもや前回の続きになりますが、structとトレイトを組み合わせで書けるのであればenumでも書けるのではないかと試行錯誤してみました。

バリアントと関数やメソッドを紐づけてConvert::ToHex.get()みたいな書き方ができればわかりやすいかな、と思ったのですが直接紐づけることはできないようです。

ただし、match式でバリアント毎に処理を分けることができますので、擬似的に紐づけは可能です。

// convert_to_ascii

// enumでの実装
#[derive(Debug)]
enum Jojo {
    Dio,
    Terence,
    Joseph,
    Tim,
}

impl Jojo {
    pub fn question(&self) -> &str {
        match self {
            Jojo::Dio => {
                let question = "お前は今まで食ったパンの枚数を覚えているのか?";
                println!("{:?}: {}", &self, question);
                question
            }
            Jojo::Terence => {
                let question = "もしかしてオラオラですかーッ!?";
                println!("{:?}: {}", &self, question);
                question
            }
            Jojo::Joseph => {
                let question = "ノックしてもしもお~し";
                println!("{:?}: {}", &self, question);
                question
            }
            Jojo::Tim => {
                let question = "おっと 会話が成り立たないアホがひとり登場〜〜 質問文に対し質問文で答えるとテスト0点なの知ってたか?マヌケ ";
                println!("{:?}: {}", &self, question);
                question
            }
        }
    }
}Code language: PHP (php)
// convert_to_ascii

    #[test]
    fn test_jojo_question() {
        Jojo::Dio.question();
        Jojo::Joseph.question();
        Jojo::Terence.question();
        Jojo::Tim.question();
    }Code language: PHP (php)

macroではどうか

DRY対策としてマクロが有効という記事を発見しました。

ちょっと試してみましたが、マクロ定義を冒頭に持ってこないといけなかったり、関数の引数としてマクロを呼ぶ場合に面倒だったりしたのでやめました。

テスト向け関数は同じような記述ばかりだったので、そちらに使うほうが良さそうです。

強力な機能のようですので、皆様試してみてはいかがでしょうか?

GitHubにコードをアップロードしています。0.1.0バージョン

コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。

# Example
$ cargo run --example first_stepCode language: Bash (bash)
管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago