言語ゲーム

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

Twitter: @propella

ActionScript3 でグローバル関数を定義する方法

ActionScript3 でグローバル関数を定義するには二つの約束を守らないといけません。

  • 無名パッケージの中に一つだけ public 関数を定義する。
  • 関数名と同じ名前のファイル名を付ける。

例えば

package {
  public function print(...s): void {
    trace(s);
  }
}

というプログラムがあった時、print.as としてソースパスの場所に保存すると、他のソースからグローバル関数として print を呼ぶ事が出来ます。

と、いうしょうもない事を調べるために一日潰してしまって悔しいのでここに書きました。色々ヒントはありました。例えばドキュメントには、ActionScript のファイル名は クラス名.as とすると書かれてあるし、たまにエラーメッセージの中に、一つのファイルには一つの public 定義しか出来ないと書かれている事があります。ここから推理すると、勘の良い人ならファイル名とクラス名が関連しているのでは無く、ファイル名とファイル内唯一の public シンボルが対応していると分かりそうな物ですが、勘の無い私には一日かかりました。

なお、ActionScript3 でグローバル変数が定義出来る事自体は、AVM の構造や、色々な記事 http://subtech.g.hatena.ne.jp/secondlife/20070219/1171872801 から分かっていたのですが、肝心なファイル名と public 定義の関係について書いてある文章は私の貧弱な検索力では未だに見つけられていません。