Rustで以下のようなenumが用意されていて
pub enum ResistorColor { Black, Brown , Red , }
次のようなテストをパスするcolors()関数を作るという問題を解いているとき
#[test] fn test_all_colors() { use ResistorColor::*; assert_eq!( colors(), vec![Black, Brown, Red] ); }
以下のような実装を思いついたが、
pub fn colors() -> Vec<ResistorColor> { vec![ResistorColor::Black, ResistorColor::Brown, ResistorColor::Red] }
このようにいちいち並べるのは変更しづらいのでenumの定義順にベクターを返すようなことをしたいがどうやるかわからなかったので調べた
Rustのenum
は標準ではできないので、crateを依存関係に追加して機能を拡張(?)する必要があるみたい
Cargoで依存関係の追加
やりたいことはenum-iterator
というクレートを使えばできるようなのでCargo.toml
の[dependencies]
にenum-iterator
というクレートを記載した
[dependencies] enum-iterator = "0.7.0
Dependencies - Rust By Example 日本語版
そして、実装はこんな感じになった
use enum_iterator::IntoEnumIterator; #[derive(Debug, PartialEq, IntoEnumIterator)] pub enum ResistorColor { Black, Brown, Red, } pub fn colors() -> Vec<ResistorColor> { resistorColor::into_enum_iter().collect() }
まず、use
でIntoEnumIterator
モジュールをスコープに持ち込む
useキーワードでパスをスコープに持ち込む - The Rust Programming Language 日本語版
次にderive
はよくわかってないがDebug
とPartialEq
とIntoEnumIterator
を宣言した
いまのところエラーがでたから追加しただけで、よくわかっていない(後日調べる)
継承(Derive) - Rust By Example 日本語版
一旦これでやりたいことが実現できた