またもや前回の続きになりますが、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
}
}
}
}
// convert_to_ascii
#[test]
fn test_jojo_question() {
Jojo::Dio.question();
Jojo::Joseph.question();
Jojo::Terence.question();
Jojo::Tim.question();
}
macroではどうか
DRY対策としてマクロが有効という記事を発見しました。
ちょっと試してみましたが、マクロ定義を冒頭に持ってこないといけなかったり、関数の引数としてマクロを呼ぶ場合に面倒だったりしたのでやめました。
テスト向け関数は同じような記述ばかりだったので、そちらに使うほうが良さそうです。
強力な機能のようですので、皆様試してみてはいかがでしょうか?
TOC
GitHubにコードをアップロードしています。
コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。
# Example
$ cargo run --examples first_step