satkaku

色々かいたものの試行錯誤

Haxeで列挙型。ついでにswf出力。

というわけで今日はHaxeで列挙型を触ってみます。
ActionScriptは素晴らしい言語ですが、enumが無いのでプンプンしてしまいますね。
腹いせに今回はswfを出力してみます。Test.hxに以下を記述します。

enum Animal {
    Dog;
    Cat;
    Human(salary:Int, pet:Animal);
}

class Test {
    static function main() {
        var cat:Animal = Animal.Cat;
        var human:Animal = Animal.Human(100, Animal.Dog);
    }

    static function bow(animal:Animal):String {
        return switch (animal) {
            case Dog : "wow";
            case Cat : "nyaa";
        }
    }
}


Haxeの列挙型は、パラメーターつきのコンストラクタも定義できます。
ここでは、salaryは人間だけに与えられた業となります。
再帰的にAnimal自体も引数に取れます。
あとは、switch文で、それぞれごとに吠えさせてみます。

build.hxmlを以下のように書いておきます。

-swf test.swf
-main Test


で、ビルド。

 $ haxe build.hxml 
 ./Test.hx:16: lines 16-19 : Some constructors are not matched : Human


Humanのcaseを定義していないので怒られました。いいところを怒ってくれます。
これは地味に便利です。

enum Animal {
    Dog;
    Cat;
    Human(salary:Int, pet:Animal);
}

class Test {
    static function main() {
        var cat:Animal = Animal.Cat;
        var human:Animal = Animal.Human(100, Animal.Dog);
        var richHuman:Animal = Animal.Human(10000, human);
        trace(bow(cat));
        trace(bow(human));
        trace(bow(richHuman));
    }

    static function bow(animal:Animal):String {
        return switch (animal) {
            case Dog : "wow";
            case Cat : "nyaa";
            case Human(salary,pet) : salary + ">>> pet bow:" + bow(pet);
        }
    }
}


Humanのcaseを追加。Humanは自身のsalaryを吠えます。ついでに人間をペットにした人間も定義してみます。
Intは""と連結することでStringになります。salaryだけを出力したい場合は、"" + salary、とすればOK。
これでもう一回ビルドすると、今度は成功し、test.swfが出力されます。
そのswfを実行すると

f:id:sat:20120905001742p:plain


こんな感じです。