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を実行すると
こんな感じです。