1. ホーム
  2. enums

[解決済み] Rust では、enum の値を繰り返し処理する方法はありますか?

2023-01-13 20:04:21

質問

私はJavaのバックグラウンドを持っており、以下のようなものがあります。 enum Direction { NORTH, SOUTH, EAST, WEST} のようなものがあり、強化されたforループで順番にそれぞれの値で何かをすることができます。

for(Direction dir : Direction.values())  {
    //do something with dir
}

Rustのenumで同じようなことをやってみたいです。

どのように解決するのですか?

いいえ、ありません。Rust の enum は Java よりもずっと強力で、実際には本格的なものだからだと思います。 代数的データ型 . 例えば、このenumの値に対してどのように反復処理を行うと思いますか?

enum Option<T> {
    None,
    Some(T)
}

?

その2番目のメンバーである Some は静的な定数ではありません。 Option<T> :

let x = Some(1);
let y = Some("abc");

の値に対して反復処理を行うことはできません。 の値を反復処理することはできません。 の列挙は正気ではありません。

もちろん、私が思うに、それは特別なサポートを追加することが可能でしょう。 静的 enum (すなわち、静的な項目のみを持つ enum) の特別なサポートをコンパイラに追加することは可能で、enum の値またはそれらを含む静的ベクトルを返す関数を生成するでしょう。

もし本当にこの機能が欲しいのであれば、カスタム構文拡張を書くことができます ( これ の問題を参照)。この拡張は識別子のリストを受け取り、これらの識別子をコンテンツとして enum と静的定数ベクトルを出力する必要があります。通常のマクロでもある程度は動作しますが、私の記憶ではマクロの引数に多重度を2回転写することはできないので、enum要素を2回手書きすることになり、不便です。

また、この問題も多少は参考になるかと思います。 #5417

もちろん、enum要素のリストを返すコードをいつでも手で書くことができます。