こねた 関数のシーケンス
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 の値が保持されていることが分かります。