enumが結構良いかもしれない

ActionScriptのArrayの中身は、Ruby等と同様どんな型も受け付けるのがちょっと嫌で、haXeに乗り換えてやろうかと思い、構文を斜め読みしていたところ、列挙型(enum)が結構見慣れない感じで新鮮だった。

以下公式サイトからの引用を少し修正しただけですが。

   enum Color {
        red;
        green;
        blue;
   }

    class Colors {
        
        //ColorからRGB値への変換
        static function toInt( c : Color ) : Int {
            return switch( c ) {
                case red: 0xFF0000;
                case green: 0x00FF00;
                //case blue:がない。defaultもない。
            }
        }
    }

このコードは、コンパイル時にエラー(blueに対する処理が無い)にしてくれる。
C++でのenumには、switchで判別しなきゃいけない場合にcase漏れを検証しきれないという不安が常に付きまとっていたのですが、こういうアプローチでの解決もあるのかと妙に感心。

更に、enumの各要素(構成子と呼ばれるらしい)は、red,greenなどの定数構成子に加えて、パラメータをとることもできる。

    enum Color2{
        red;
        green;
        blue;
        grey(v:Int);
        rgb(r:Int, g:Int, b:Int);
    }
    
    //次の値はどれもColor2
    red;
    green;
    grey(0);
    grey(128);
    rgb(0xAD,0xD8,0xE6); //Light Blue

これだけだと何の意味があるのかわかりませんが、switchと組み合わせて使うときに効力を発揮する。

    class Colors{
        static function toInt( c : Color2 ) : Int {
            return switch( c ) {
                case red: 0xFF0000;
                case green: 0x00FF00;
                case blue: 0x0000FF;
                case grey(v): (v << 16) | (v << 8) | v;
                case rgb(r,g,b): (r << 16) | (g << 8) | b;
            }
        }
    }

これって、明示的には言及されていないけど、ある種のパターンマッチ?