こねた 関数のシーケンス

JavaFX Script には関数型があることはみなさまご存じの通り。

たとえば、Node クラスの onMousePressed などが関数型の変数ですね。

ところで、JavaFX で関数型のシーケンスは可能なのでしょうか?

答え 可能です

たとえば、引数が x: Integer で、戻り値も Integer の関数のシーケンスであれば次のようにかけます。

    var functions: (function(x: Integer): Number)[] = [
        function(x: Integer): Number {
            return x*2;
        },
        function(x: Integer): Number {
            return x + 10;
        }
    ];

宣言のところで function(x: Integer): Number をカッコにくくっているのは、くくらないと Number のシーケンスが戻り値の関数ということになってしまうからです。

実際にシーケンスの関数をコールするには

    functions[0](10);

のように記述します。

ちなみに JavaFX の関数はクロージャーとしても使えるのでこんな使い方もできます。

public function bar(functions: (function(x: Integer): Number)[]) {
    for (func in functions) {
        println("[{indexof func}] value = {func(20)}");
    }
}

public function run(): Void {
    var y = 10;

    var functions: (function(x: Integer): Number)[] = [
        function(x: Integer): Number {
            return x * y;
        },
        function(x: Integer): Number {
            return x + y;
        }
    ];

    bar(functions);
}

これを実行すると

[0] value = 200.0
[1] value = 30.0

のように、関数を定義した時のローカル変数 y の値が保持されていることが分かります。