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