コンピュータ プログラミングでは、列挙型( R プログラミング言語では列挙、enum、または因子、COBOLプログラミング言語では条件名、 JOVIALプログラミング言語ではステータス変数、PL/I プログラミング言語では順序数、統計ではカテゴリ変数とも呼ばれる) は、型の要素、メンバー、列挙子、または列挙子と呼ばれる名前付き値の集合からなるデータ型です。列挙子の名前は通常、言語で定数として動作する識別子です。列挙型は、単位型の退化したタグ付き共用体と見なすことができます。列挙型として宣言された変数には、任意の列挙子を値として割り当てることができます。言い換えれば、列挙型には互いに異なる値があり、比較および割り当てが可能ですが、一般的には、プログラマによってコンピュータのメモリに特定の具体的な表現を持つように指定されることはありません。コンパイラやインタプリタは、それらを任意に表現することができる。
例えば、トランプの4つのスートはCLUBS、 、DIAMONDS、HEARTS、という4つの列挙子で表されSPADES、 という列挙型に属しますCardSuit。変数がvをデータ型として宣言されている場合CardSuit、これらの4つの値のいずれかをその変数に代入できます。
列挙子は通常は区別されますが、言語によっては、同じ列挙子を型の宣言で2回指定できる場合があります。列挙子の名前は、意味的に完全である必要も、いかなる意味でも互換性がある必要もありません。たとえば、 という列挙型は、 、、、、 というColor列挙子で構成されるように定義できます。一部の言語では、列挙型の宣言でそのメンバーの順序( 、および優先順位)が意図的に定義されます。他の言語では、列挙子は順序付けされていません(、、および がサポートされている言語)。さらに他の言語では、コンパイラが列挙子を整数として具体的に表現することで暗黙の順序付けが生じます。REDGREENZEBRAMISSINGBACONHIGHMEDIUMLOWENGLISHFRENCHGERMANSPANISH
列挙型の中には、言語に組み込まれているものもあります。例えば、ブール型は、多くの場合、値falseとをあらかじめ定義した列挙型ですtrue。単一の値で構成される単位型を定義して、を表すこともできますnull。多くの言語では、ユーザーが新しい列挙型を定義できます。
列挙型の値と変数は、通常、基となる表現として何らかの整数型を用いて実装されます。一部の言語、特にシステムプログラミング言語では、各列挙子に使用するビットの組み合わせをユーザーが指定できるため、列挙子のセットを固定長のビット列として効率的に表現するのに役立ちます。型理論では、列挙型はしばしば単位型のタグ付き共用体とみなされます。このような型は、次の形式であるためです。それらは自然数として表記されることもあります。
初期のプログラミング言語の中には、当初は列挙型がなかったものもあった。例えばmyColor、変数に という値を持たせたい場合RED、定数を宣言し、任意の値(通常は整数定数)を割り当てた。そして、REDその定数を に割り当てた。他の手法では、列挙子の名前を含む文字列に任意の値を割り当てていた。REDmyColor
これらの恣意的な値は、その算出方法や実際の値の意味について説明がほとんどないことから、 「マジックナンバー」と呼ばれることがありました。こうしたマジックナンバーは、ソースコードの理解や保守を困難にする可能性がありました。
一方、列挙型はコードの自己説明性を高めます。言語によっては、コンパイラが列挙子にデフォルト値を自動的に割り当て、プログラマから不要な詳細を隠すことができます。これらの値はプログラマには見えない場合もあります(情報隠蔽を参照)。列挙型は、列挙子の値に対して数学演算を実行するなど、プログラマが非論理的なコードを書くことを防ぐこともできます。列挙子が割り当てられた変数の値を出力する場合、一部のプログラミング言語では、基となる数値ではなく、列挙子の名前を出力することもできます。さらに、列挙型を使用すると、コンパイラが意味の正しさを強制できるという利点もあります。たとえば、は myColor = TRIANGLE 禁止されますが、は 受け入れられます。これは、とが両方とも内部的に値で表現されているmyColor = RED 場合でも同様です。TRIANGLERED1
概念的には、列挙型は名詞(数値コード)のリストに似ています。なぜなら、型の各可能な値にはそれぞれ固有の自然数が割り当てられるからです。したがって、特定の列挙型はこの概念の具体的な実装と言えます。順序が意味を持ち、かつ/または比較に使用される場合、列挙型は順序型となります。
プログラミング言語には、それぞれ独自の、場合によっては複数のプログラミングスタイルと命名規則があります。列挙型に割り当てられる変数は通常、単数形の名詞であり、多くの場合、パスカルケースまたは大文字の規則に従いますが、小文字やその他の形式はあまり見られません。
ALGOL 60自体には列挙型はないが、そこから派生したいくつかの言語には列挙型が存在する。特に、PascalはAdaの設計に大きな影響を与えた。
Pascalでは、括弧で囲んだリストに値を列挙することで、列挙型を暗黙的に宣言できます。
var suit : ( clubs , diamonds , hearts , spades ) ;この宣言は、多くの場合、型シノニム宣言の中に現れ、複数の変数に使用できるようになっています。
type cardsuit = ( clubs , diamonds , hearts , spades ) ; card = record suit : cardsuit ; value : 1 .. 13 ; end ; var hand : array [ 1 .. 13 ] of card ; trump : cardsuit ;列挙値の順序は重要です。列挙型は順序型であり、およびpred関数succは列挙の前のまたは次の値を取得し、ord列挙値を整数表現に変換できます。ただし、標準の Pascal では、算術型から列挙型への変換は提供されていません。拡張 Pascal では、拡張succ関数を介してこの機能が提供されます。他の Pascal 方言の中には、型キャストを介してこれを可能にするものもあります。Modula -3などの Pascal の現代的な派生言語の中には、と呼ばれるメソッドを使用して特別な変換構文を提供するものがあります。Modula-3 では、およびを特別な事前定義列挙型としてVAL扱い、およびを標準 ASCII のデコードおよびエンコードに使用します。BOOLEANCHARORDVAL
Pascalスタイルの言語では、列挙型を配列のインデックスとして使用することもできます。
var suitcount : array [ cardsuit ] of integer ;Adaでは、列挙型の定義は Pascal と似ており、「="」の代わりに「is」が使われています。
トランプのマークの種類は(クラブ、ダイヤ、ハート、スペード)です。Pred、、に加えてSucc、 AdaValは、およびPosを介して単純な文字列変換もサポートしています。ImageValue
C言語と同様に、Adaでは列挙の内部表現を指定できます。
カードスーツでの使用(クラブ=> 1 、ダイヤ=> 2 、ハート=> 4 、スペード=> 8 )Adaでは、列挙のビット数を直接的に指定できます。これは、サポートが一貫しておらず、微妙なコンパイルエラーにつながることが多いCスタイルの言語とは異なります。[ 1 ]例えば、
カードスーツのサイズには4を使用します。-- 4ビットさらに、Pascalのように列挙型を配列のインデックスとして使用できますが、列挙型には属性が定義されています。
Shuffle :定数配列( Cardsuit ) of Cardsuit := ( Clubs => Cardsuit ' Succ ( Clubs ), -- 列挙型の属性 'First, 'Last, 'Succ, 'Pred を参照Diamonds => Hearts , -- 明示的な値Hearts => Cardsuit ' Last , -- Cardsuit 型の最初の列挙値 (例: clubs) Spades => Cardsuit ' First -- Cardsuit 型の最後の列挙値 (例: spades ) );Modula-3と同様に、AdaはBoolean、およびをCharacter(パッケージ「 」内の)特別な事前定義Standard列挙型として扱います。Modula-3とは異なり、独自の文字型を定義することもできます。
カードの型は(' 7 ', ' 8 ', ' 9 ', ' X ', ' J ', ' Q ', ' K ', ' A ')です。オリジナルの PL/I も ANSI X3.53–1976 も列挙型を持っていませんが、IBM Enterprise PL/I [ 2 ]には順序型があります。
順序変数は、添え字として直接使用することも、DO TO制限として使用することもできません。ただし、
define ordinal foo ( green , with , envy ) ; declare ix ordinal foo , bar ( first ( : foo :) : last ( : foo :)) fixed bin ; do i = first ( : foo :) to last ( : foo :) ; bar ( i )= 13 ; end ; do ix = first ( : foo :) upthru last ( : foo :) ; i = binaryvalue ( ix ) ; bar ( i ) = bar ( i ) + 1 ; end ; do ix = first ( : foo :) repeat ordinalsucc ( ix ) until ( ix = first ( : foo :)) /* ラップアラウンドで停止。 */ ; i = binaryvalue ( ix ) ; display ( bar ( i ) || ' at ' || ix ) ; end ;プログラミング言語CのオリジナルのK&R方言には列挙型はありませんでした。[ 3 ] Cでは、列挙型は明示的な定義によって作成されます(キーワードだけではストレージの割り当ては発生しません)。この定義ではキーワードが使用され、構造体や共用体の定義を彷彿とさせます。enumenum
typedef enum { CLUBS , DIAMONDS , HEARTS , SPADES , } CardSuit ;typedef struct { CardSuit suit ; short value ; } Card ;カードの手札[ 13 ];カードのスートの切り札;C言語では、列挙値の整数表現がプログラマに直接公開されます。整数と列挙値は自由に混在させることができ、列挙値に対するすべての算術演算が許可されています。列挙変数に、列挙値のいずれをも表さない整数を保持することも可能です。実際、言語定義によれば、上記のコードは、、、、を型の定数として定義し、Clubsそれらがその型の変数に格納された場合にのみ(暗黙的に)に変換されます。DiamondsHeartsSpadesintenum CardSuit
C言語では、型を指定しなくても、列挙定数の値を明示的に選択することもできます。たとえば、
enum CardSuit { CLUBS = 1 , DIAMONDS = 2 , HEARTS = 4 , SPADES = 8 , };これは、数学的なスートの集合をビットごとの論理演算によって表現できる型を定義するために使用できますenum CardSuit。
C23以降、列挙型の基底型はC++と同じ構文でプログラマーが指定できるようになりました。[ 4 ]これにより、プログラマーはよりコストの低い基底型を選択することで、最適化された列挙型を作成できます。
enum CardSuit : char { CLUBS = 1 , DIAMONDS = 2 , HEARTS = 4 , SPADES = 8 , };C言語の列挙型は、名前空間機能がないため、スコープや修飾子を持ちません。C23でキーワードが導入される以前は、 Cプリプロセッサconstexprを使用せずにコンパイル時定数を宣言するために列挙型がよく使われていました。
C#プログラミング言語の列挙型は、C の列挙型の「小さな整数」セマンティクスのほとんどを保持しています。C# では、すべての列挙型は を拡張するクラスですSystem.Enum。[ 5 ]列挙型に対して定義されていない算術演算もありますが、列挙値は明示的に整数に変換したり、再び整数に戻したりすることができ、列挙変数は列挙型の定義で宣言されていない値を持つことができます。たとえば、
enum CardSuit { Clubs , Diamonds , Spades , Hearts , }式CardSuit.Diamonds + 1と はCardSuit.Hearts - CardSuit.Clubs直接使用できます (値のシーケンスを順に確認したり、2 つの値の間にいくつのステップがあるかを尋ねたりすることが意味をCardSuit.Hearts * CardSuit.Spades持つ可能性があるため) が、 はあまり意味がないとみなされ、値を最初に整数に変換した場合にのみ使用できます。
C# は、列挙型に特定の整数値を定義できるという C 言語に似た機能も提供しています。これにより、列挙型に対してバイナリ演算を実行できるため、列挙値をフラグのセットとして扱うことができます。これらのフラグは、バイナリ演算または列挙型の組み込みHasFlag()メソッドを使用してテストできます。[ 6 ]
列挙定義は選択された整数値の名前を定義し、列挙定義の範囲外の整数値を列挙変数に割り当てることができるため、構文糖衣です。 [ 7 ] [ 8 ] [ 9 ]
C++には、Cから直接継承された列挙型があり、ほとんど同様に動作しますが、C++では列挙型は実際の型であるため、コンパイル時のチェックが追加されます。また、(構造体と同様に)C++のキーワードはtypedefenumと組み合わせて使用されるため、型をとして参照する代わりに、単にとして参照できます。これは、Cではtypedefを使用してシミュレートできます。enumMyEnumMyEnumtypedefenum{VALUE_1,VALUE_2}MyEnum;
C++11では、スコープ付き列挙と呼ばれる 2 種類目の列挙も提供されています。これらは型安全です。列挙子は暗黙的に整数型に変換されません。これにより、列挙型に対して I/O ストリーミングを定義できます。スコープ付き列挙のもう 1 つの特徴は、列挙子を列挙名で修飾する必要があることです。そのため、列挙子を現在のスコープに取り込む宣言 ( C++20で導入Color::RED) が使用されていない限り、列挙名をプレフィックスとして付ける必要があります (たとえば、以下の例の最初の列挙子の場合)。スコープ付き列挙は、句(または) で指定します。例:usingenumenumclassenumstruct
// Cスタイルのスコープなし列挙型 enum CardSuit { CLUBS , DIAMONDS , SPADES , HEARTS , } ;// C++11 スタイルのスコープ付き列挙型 enum class Color { RED , GREEN , BLUE , } ;int main ( int argc , char * argv []) { Color c = Color :: RED ;// スコープなしの C スタイルの列挙型CardSuit card1 = Clubs ; // スコープなしにもなり得るCardSuit card2 = CardSuit :: SPADES ; // 通常はスコープ付きで宣言される}列挙型の基底型は、列挙されるすべての値を格納するのに十分な大きさの、実装定義の整数型です。必ずしも最小の型である必要はありません。基底型は直接指定できるため、列挙型の「前方宣言」が可能になります。
// サイズとメモリレイアウトに収まる必要がある型 'long' enum class Color : long { RED , GREEN , BLUE , };// 前方宣言。後で定義された値が'char' に収まらない場合はエラーです。enum class Shapes : char ;Go は識別子を使用してiota列挙定数を作成します。[ 10 ] [ 11 ]
型ByteSize intconst ( _ = iota // 最初の値を空の識別子に代入して無視します。0 KB ByteSize = 1 << ( 10 * iota ) // 1 << (10 * 1) == 1 << 10 == 1024; バイナリでは 10000000000 MB // 1 << (10 * 2) == 1048576; バイナリでは 100000000000000000000 GB // 1 << (10 * 3) == 1073741824; バイナリでは 1000000000000000000000000000000 )Javaプログラミング言語のJ2SEバージョン5.0では、C言語の宣言構文に似た列挙型が追加されました。
enum CardSuit { CLUBS , DIAMONDS , SPADES , HEARTS , };カードスーツ切り札;しかし、Java の型システムでは、列挙型は整数とは別の型として扱われ、列挙値と整数値の混在は許可されていません。実際、Java の列挙型は、算術型ではなく、コンパイラによって生成される特別なクラスであり、列挙値はそのクラスのグローバルな事前生成インスタンスとして動作します。列挙型にはインスタンス メソッドとコンストラクタ (引数は各列挙値ごとに個別に指定可能) があります。すべての列挙型は暗黙的にEnum抽象クラスを継承するため、列挙型は他の何も継承できません。クラスjava.lang.Enum<E>は次のように制約されます。列挙型は直接インスタンス化できません。[ 12 ]Enum<EextendsEnum<E>>
内部的には、各列挙値には、ソース コードで宣言された順序に対応する整数が含まれており、0 から始まります。プログラマは列挙値に直接カスタム整数を設定することはできませんが、オーバーロードされたコンストラクタを定義して、列挙クラスの自己定義メンバーに任意の値を割り当てることができます。ゲッターを定義すると、これらの自己定義メンバーにアクセスできるようになります。内部整数はordinal()、メソッドを使用して列挙値から取得でき、列挙型の列挙値のリストは、メソッドを使用して順番に取得できますvalues()。プログラマが列挙型を整数に変換したり、その逆を行ったりすることは、一般的に推奨されません。[ 13 ]列挙型はjava.lang.Comparable<T>、内部整数を使用して、結果としてソートできます。
Java 標準ライブラリは、列挙型で使用するためのユーティリティクラスを提供します。このEnumSetクラスはjava.util.Set<E>列挙値の配列を実装します。これはビット配列として実装されているため、非常にコンパクトで、明示的なビット操作と同じくらい効率的ですが、より安全です。このEnumMapクラスは列挙値をオブジェクトに配列しますjava.util.Map<K, V>。これは配列として実装され、列挙値の整数値がインデックスとして機能します。
C++とは異なり、Javaの列挙型は他のクラスと同様に、メソッド、コンストラクタ、フィールドを持つことができます。
public enum Planet { // 惑星、続いて質量と半径MERCURY ( 3.303e+23 , 2.4397e6 ), VENUS ( 4.869e+24 , 6.0518e6 ), EARTH ( 5.976e+24 , 6.37814e6 ), MARS ( 6.421e+23 , 3.3972e6 ), JUPITER ( 1.9e+27 , 7.1492e7 ), SATURN ( 5.688e+26 , 6.0268e7 ), URANUS ( 8.686e+25 , 2.5559e7 ), NEPTUNE ( 1.024e+26 , 2.4746e7 );public static final double G = 6.67300E-11 ;private final double mass ; private final double radius ;惑星( double mass , double radius ) { this.mass = mass ; this.radius = radius ; }private double mass () { return mass ; }private double radius () { return radius ; }double surfaceGravity () { return G * mass / ( radius * radius ); }double surfaceWeight ( double otherMass ) { return otherMass * surfaceGravity (); }public static void main ( String [] args ) { double earthWeight = Double.parseDouble ( args [ 0 ] ) ; double mass = earthWeight / EARTH.surfaceGravity ( ); for ( Planet p : Planet.values ( ) ) { System.out.printf ( " Your weight on % s is %f % n " , p , p.surfaceWeight ( mass ) ) ; } } }C言語の構文の伝統を受け継ぐ動的型付け言語( PerlやJavaScriptなど)は、一般的に列挙型を提供していません。しかし、Perlプログラミングでは、文字列リストやハッシュ(場合によってはスライス)の省略形を用いることで、同じ結果を得ることができます。
my @enum = qw(Clubs Diamonds Hearts Spades) ; my ( %set1 , %set2 ); @set1 { @enum } = (); # すべてクリア@set2 { @enum } = ( 1 ) x @enum ; # すべて 1 に設定$set1 { Clubs } ... # false $set2 { Diamonds } ... # trueRaku(旧称Perl 6)は列挙型をサポートしています。Rakuでは列挙型を宣言する方法が複数あり、いずれもバックエンドにMapを作成します。
enum Cat <sphynx siamese bengal shorthair other> ; # "quote-words" を使用enum Cat ( 'sphynx' , 'siamese' , 'bengal' , 'shorthair' , 'other' ); # リストを使用enum Cat ( sphynx => 0 , siamese => 1 , bengal => 2 , shorthair => 3 , other => 4 ); # Pair コンストラクタの使用enum Cat (: sphynx ( 0 ), : siamese ( 1 ), : bengal ( 2 ), shorthair ( 3 ), : other ( 4 )); # Pairs を使用する別の方法として、`:0sphynx` を使用することもできます。列挙型はPHPバージョン8.1で追加されました。
enum CardSuit { case Hearts ; case Diamonds ; case Clubs ; case Spades ; }列挙子は、シリアル化を容易にするために、文字列または整数値によって裏付けられる場合があります。
enum CardSuit : string { case Hearts = 'H' ; case Diamonds = 'D' ; case Clubs = 'C' ; case Spades = 'S' ; }Enumのインターフェースは、列挙子とその名前のコレクションを取得するメソッドを公開します。文字列/整数を裏付けとするEnumは、裏付けとなる値と、逆シリアル化を試みるためのメソッドも公開します。ユーザーはさらにメソッドを追加することもできます。
RustはenumC言語と同様にキーワードを使用しますが、それはタグ付き共用体を記述するために使用され、列挙型はタグ付き共用体の退化した形態とみなすことができます。そのため、Rustの列挙型ははるかに柔軟性が高く、構造体やタプルのバリアントを含むことができます。
enum Message { Quit , Move { x : i32 , y : i32 }, // struct Write ( String ), // 1要素タプルChangeColor ( i32 , i32 , i32 ), // 3要素タプル}C言語と同様に、Rustも各バリアントの値を指定することをサポートしており、
pub enum Weekday { Sunday = 1 , Monday = 2 , Tuesday = 4 , Wednesday = 8 , Thursday = 16 , Friday = 32 , Saturday = 64 , }C言語では、列挙型は一連の整数値にそれぞれ関連する名前を割り当てます。Swiftでは、列挙型ははるかに柔軟で、列挙の各ケースに値を指定する必要はありません。列挙の各ケースに値(生の値と呼ばれる)を指定する場合、その値は文字列、文字、または任意の整数型もしくは浮動小数点型の値にすることができます。
あるいは、列挙ケースでは、他の言語における共用体やバリアントと同様に、各ケース値とともに格納される任意の型の関連値を指定できます。関連するケースの共通セットを1つの列挙の一部として定義し、それぞれのケースに適切な型の異なる値のセットを関連付けることができます。
Swiftでは、列挙型は第一級型です。列挙型の現在の値に関する追加情報を提供する計算プロパティや、列挙型が表す値に関連する機能を提供するインスタンスメソッドなど、従来クラスのみがサポートしていた多くの機能を備えています。また、列挙型は初期化子を定義して初期ケース値を指定したり、元の実装を超えて機能を拡張したり、プロトコルに準拠して標準機能を提供したりすることもできます。
enum CardSuit { case clubs case diamonds case hearts case spades }C言語やObjective-Cとは異なり、Swiftの列挙型は作成時にデフォルトの整数値が割り当てられません。上記のCardSuitの例では、クラブ、ダイヤ、ハート、スペードは暗黙的に0、1、2、3に等しくなるわけではありません。代わりに、それぞれの列挙型は、CardSuitという明示的に定義された型を持つ、独立した値として扱われます。
複数の事例は、カンマで区切って1行に記述できます。
enum CardSuit { case clubs , diamonds , hearts , spades }整数または文字列の生の値を格納する列挙型を扱う場合、Swiftが自動的に値を割り当てるため、各ケースに対して明示的に生の値を割り当てる必要はありません。
例えば、生の値に整数を使用する場合、各ケースの暗黙の値は前のケースより1大きくなります。最初のケースに値が設定されていない場合、その値は0になります。CardSuitの例では、次のように記述することで、スートを1から番号付けできます。
enum CardSuit { case clubs = 1 , diamonds , hearts , spades }TypeScriptはJavaScriptに「enum」データ型を追加します。
enum CardSuit {クラブ、ダイヤ、ハート、スペード};let c : CardSuit = CardSuit . Diamonds ;デフォルトでは、列挙型のメンバー番号は0から始まります。これは、最初の要素の値を設定することで上書きできます。
enum CardSuit { Clubs = 1 , Diamonds , Hearts , Spades };let c : CardSuit = CardSuit . Diamonds ;すべての値を設定できます。
enum CardSuit { Clubs = 1 , Diamonds = 2 , Hearts = 4 , Spades = 8 };let c : CardSuit = CardSuit . Diamonds ;TypeScriptは、数値をその名前にマッピングすることをサポートしています。たとえば、これは値2の名前を見つけます。
enum CardSuit { Clubs = 1 , Diamonds , Hearts , Spades };let suitName : string = CardSuit [ 2 ];アラート(スーツ名)Python 標準ライブラリにバージョン 3.4 でモジュールが追加されました。このモジュールは、列挙型を定義するために拡張可能なenumクラスを導入します。Enum
from enum import Enumclass CardSuit ( Enum ): CLUBS : int = 1 DIAMONDS : int = 2 HEARTS : int = 3 SPADES : int = 4自動生成されたインデックス(最初は1)を使用して列挙型を作成するための機能的なAPIも用意されています。
カード: Enum = Enum ( "Cards" , "CLUBS DIAMONDS HEARTS SPADES" )Pythonの列挙型は意味的な正しさを強制しません(互換性のない列挙型との意味のない比較は、TypeErrorを発生させるのではなく常にFalseを返します)。
色: Enum = Enum ( "Color" , "RED GREEN BLUE" )形状: Enum = Enum ( "Shape" , [ "CIRCLE" , "TRIANGLE" , "SQUARE" , "HEXAGON" ])def has_vertices ( shape : Enum ) - > bool : return shape ! = Shape.CIRCLEif __name__ == "__main__" : has_vertices ( Color . GREEN ) # "True" を出力しますDartは最も基本的な形式の列挙型をサポートしており、列挙型をサポートする他の言語と同様の構文を備えています。
enum CardSuit {クラブ、ダイヤモンド、ハート、スペード}void main () {CardSuit card = CardSuit.Clubs ;// Dart では、列挙型の値を目的の出力と一致させるために「switch」演算子を使用します。switch ( card ) {case CardSuit.Clubs : {print ( "クラブ" );}壊す;case CardSuit . Diamonds: {print ( "ダイヤモンド" );}壊す;case CardSuit.Hearts : {print ( "ハート" );}壊す;case CardSuit.Spades : {print ( "スペード" );}壊す;デフォルト:{print ( "不明" );}壊す;}}Dart 3 より前は、[ 14 ] switch 演算子はケースの完全性を保証していませんでした。つまり、1 つのケースを省略しても、コンパイラはエラーを発生させませんでした。
COBOLでは、条件変数は、条件名と呼ばれる下位レベル88フィールドを持つ通常の変数です。各条件名にはVALUE句が必要です。条件句のVALUE句では、単一の値または値のリストを指定できます。
Fortran 2003 では、C との相互運用性のために列挙子が導入されました。そのため、セマンティクスは C と類似しており、C と同様に、列挙値は単なる整数であり、それ以上の型チェックは行われません。上記の C の例は、Fortran では次のように記述できます。
enum 、bind ( C ) enumerator :: CLUBS = 1 、DIAMONDS = 2 、HEARTS = 4 、SPADES = 8 end enumFortran 2023 では、真の列挙型が導入されました。値は指定された順序で並べられます。組み込み関数intはhuge列挙をサポートしています。関数nextともprevious利用可能です。
列挙型:: days_of_week列挙子:: monday , tuesday , wednesday , thursday , friday列挙子:: saturday , sunday列挙型終了type ( days_of_week ) :: dow : if ( dow == wednesday ) then print * , 'hump day' end if : select case ( dow ) case ( monday : friday ) print * , 'weekday' case ( saturday , sunday ) print * , 'weekend' end selectCommon Lispでは、メンバ型指定子を使用します。例:
( deftype cardsuit () ' ( member club diamond heart spade ))#'eqlこれは、オブジェクトがクラブ、ダイヤ、ハート、スペードのいずれかである場合、そのオブジェクトがカードスーツ型であることを示しています。ただし、このメンバ型指定子は、Common Lisp Object System(eql atom) (CLOS) パラメータ特殊化子としては有効ではありません。代わりに、 と同等の を(member atom)使用できます (つまり、セットの 1 つのメンバのみを eql 型指定子で指定できますが、CLOS パラメータ特殊化子として使用できます)。言い換えれば、列挙型をカバーするメソッドを定義するには、その型の各特定要素に対してメソッドを定義する必要があります。
さらに、
( deftype finite-element-set-type ( &rest elements ) ` ( member ,@ elements ))実行時に任意の列挙型を定義するために使用できます。たとえば
(有限要素集合型クラブダイヤハートスペード)これは、カードスーツの以前の定義と同等のタイプを指すことになるでしょう。もちろん、単に
(メンバークラブダイヤモンドハートスペード)#'memberしかし、スタイル上の理由から、機能との混同が少なくなるかもしれない。
ML系の関数型プログラミング言語(Standard ML(SML)、OCaml、Haskellなど)では、引数なしコンストラクタのみを持つ代数的データ型を使用して列挙型を実装できます。例えば(SMLシグネチャの構文では):
データ型cardsuit =クラブ|ダイヤ|ハート|スペード型card = { suit : cardsuit ; value : int } val hand :カードリストval trump : cardsuitこれらの言語では、実装でそのような表現が使用されている場合でも、小整数表現はプログラマーから完全に隠蔽されています。しかし、HaskellにはEnum型クラスがあり、型はそれを派生または実装することで、型と の間のマッピングを取得できますInt。
一部のデータベースは列挙型を直接サポートしています。MySQLは、テーブル作成時に文字列として指定可能な値を持つ列挙型を提供しますENUM。値は数値インデックスとして格納され、空の文字列は0、最初の文字列値は1、2番目の文字列値は2などとして格納されます。値は数値インデックスまたは文字列値として格納および取得できます。[ 15 ]
例:
CREATE TABLE shirts ( name VARCHAR ( 40 ), size ENUM ( 'x-small' , 'small' , 'medium' , 'large' , 'x-large' ) );JSONスキーマでは「enum」キーワードを使用して定義できます。[ 16 ]
{ "$schema" : "https://json-schema.org/draft/2020-12/schema" , "type" : "object" , "properties" : { "cardsuit" : { "type" : "string" , "enum" : [ "Clubs" , "Diamonds" , "Hearts" , "Spades" ] } }, "required" : [ "cardsuit" ] }XMLスキーマは、文字列などのほとんどの基本データ型を制約するために使用される列挙ファセットを通じて、列挙型をサポートしています。
<xs:element name= "cardsuit" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:enumeration value= "Clubs" /> <xs:enumeration value= "Diamonds" /> <xs:enumeration value= "Hearts" /> <xs:enumeration value= "Spades" /> </xs:restriction> </xs:simpleType> </xs:element>では、列挙型は完全なクラスであり、型安全であり、メソッド、フィールドを追加したり、インターフェースを実装したりして拡張できます。一方、C# では、列挙型は整数型 (通常は int) の単なる構文糖衣であり、拡張できず、型安全ではありません。
{{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)Java 1.5 に関する情報を列挙します。 Nach vielen Beteuerungen durch Sun, Enums seien in Java überflüssig und können einfach nachgebildet werden, wurden sie nun doch eingefüult. Die einfachste Möglichkeit einer Enumeration der Jahreszeiten sieht wie folgt aus … Das Schlüsselwort enum steht für eine spezielle Art von Klasse, die eine Enumeration definiert. …
私は、C/C++ と C# に関するプログラムの開発を行っており、Gleichheitszeichen の重要性を理解しながら、Zahlen zuordnen を実行しています。
{{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク)代替URL 2013年5月27日にWayback Machineにアーカイブされました設計の悪い enum は、このような動作をしません。明らかに (他のすべてと同様に)、この糖衣を誤用すると、システムが高血糖に苦しむことになります。… enum の基底型が int (他の整数型も使用可能) であるため、ビット演算子を介して enum をビットフラグとして使用すると、興味深い問題が発生する可能性があります。
{{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)の iota 識別子は、定数宣言で使用され、インクリメントされる数値の定義を簡素化します。式で使用できるため、単純な列挙よりも汎用性があります。