言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ActionScript の API に動的にアクセスする方法

前回、http://d.hatena.ne.jp/propella/20090805/p1 の中で package と名前空間の関係についてさらりと書きました。名前空間を使うと import しなくてもライブラリを呼べます。その時ご紹介したコードは次のような物です。

namespace ns = "flash.text";
var field = new ns::TextField();

このようなコードは、例えば ActionScript でメタサーギュラーなインタプリタを作りたい場合必須だと思います。でも色々やってみると問題がありました。この namespace 構文では左辺にリテラルしか指定出来ないのです。ガックリしたと思いきや、実は実行時に名前空間を組み立てるには Namespace オブジェクトを使えば良いと分かりました。

var ns = new Namespace("flash.text");
var field  = new ns::["TextField"]();

この構文を使えば、名前空間、クラス名とも実行時に決める事が出来ます。プログラム全体はこんな感じ。残念ながら、実行時にクラスを作る方法は分かりませんでした。

// hellons.as
package {
    import flash.display.Sprite;

    public class hellons extends Sprite {
        public function hellons() {
            super();
	    var ns = new Namespace("flash.text");
	    var field  = new ns::["TextField"]();
	    field.text = "This is Dynamite!";
	    addChild(field);
        }
    }
}