省略可能な引数

変数名の前に?マークを付けるか、デフォルト値を準備することで、関数のパラメータを省略可能にできます。

  • デフォルト値は単にパラメータを省略可能にします。
  • ?マークを付加することで変数はnullableになります。

class Test {
    static function foo( x:Int, ?y:Int, z:String="hello" ) {
        trace(x + "," + y + "," + z);
    }
    static function main() {
        foo(1, 2, "world"); // 1,2,world
        foo(3); // 3,null,hello
    }
}

デフォルト値

指定が無い場合、省略可能なパラメータはデフォルト値nullを持ちます。その他のデフォルト値を指定することも可能です。

例です。

    static function foo( x:Int, y:Int=5, z:String="hello" ) {
        // ...
    }

型推論により以下のような短い構文も使用できます。

    static function foo( x:Int, y=5, z="hello" ) {
        // ...
    }

null値を許可する変数(nullable)

指定が無い場合、省略可能なパラメータはデフォルト値nullを持ちますが、静的型付けのプラットフォームではnullは基本型ではありません。
これらのプラットフォームでは、以下のような関数定義は…

static function foo( ?x:Int ) {

以下と同じです。

static function foo( ?x:Null<Int>) {

また、以下の関数を考えた場合…

static function foo( x=1 ) {

foo(null);と呼び出すことはできません。この場合、?マークを使います。

static function foo( ?x=1 ) {

あるいは型指定を行います。

static function foo( x:Null<Int>=1 ) {

順番

省略可能なパラメータをパラメータの最後に置く例をあげてきましたが、省略可能なパラメータを最初や中間に置くことも可能です。
そして、省略可能なパラメータは独立しています。つまり、省略可能なパラメータは、その前のパラメータを省略した場合でも指定可能です。

    function foo( ?x:A, ?y:B ) {
    }

    foo(new A()); //foo(new A(),null)と同じ
    foo(new B()); //foo(null, new B())と同じ
    foo(); //foo(null,null)と同じ
    foo(new C()); //コンパイルエラー
    foo(new B(),new A()); //エラー: 順序の入れ替えはできません

しかし、このような省略可能な引数の使用法は、場合によっては非常に難解になってしまいます。

列挙型の値

列挙型の値は省略可能な引数にデフォルト値をあたえることはできません。詳しくは列挙型(enum)を参照してください。

注意

省略可能な引数はコンパイル時の機能です。そのため、動的な呼び出しやReflectの使用ではプラットフォームごとに挙動が異なる場合があります。

«« Properties | 条件付きコンパイル »»

version #16040, modified 2013-02-23 17:31:59 by shohei909