さてさて、Haxeネタ書きます。今日はClojureネタ書いたので軽めに。
関数値としてのHaxe
関数値
さてさて、Haxeは関数を値として持ち、また、それを好きなときに呼び出すことができます。
Sample.hx
class Sample{
public static function main(){
var foo = function(){ trace('foo!'); };
foo();
}
}
メンバ変数にメソッドを代入する
また、Haxeは関数値なので、メンバ変数として利用することもできます。
Hoge.hx
class Hoge{
public var foo : Void -> Void;
public function new(){}
public function callFoo(){
this.foo();
}
}
このように、外から関数値を代入することができます。
SampleHoge.hx
class SampleHoge{
public static function main(){
var hoge = new Hoge();
hoge.foo = function(){ trace("hoge!"); };
hoge.callFoo();
}
}
ちなみに、var foo : Void -> Void; dynamic public function foo(){}とほぼ同等です。
Hoge2.hx
class Hoge2{
dynamic public function foo(){};
public function new(){}
public function callFoo(){
this.foo();
}
}
メソッドをメンバ変数に代入する
さて、bazメソッドを持つPiyoというクラスがあったとします。
Piyo.hx
class Piyo{
public var bar = "piyo";
public function new(){}
public function baz(){
trace(this.bar);
}
}
このように、メソッドをメンバに代入して、 代入したオブジェクトで、呼びだすことができます。
SamplePiyo.hx
class SamplePiyo{
public static function main(){
var hoge = new Hoge();
var piyo = new Piyo();
hoge.foo = piyo.baz;
hoge.callFoo();
// => piyo!
piyo.bar = "piyopiyo";
hoge.callFoo();
// => piyopiyo!
}
}
関数値を利用例
では、実際に関数値を利用する場合はいつでしょうか?
実際に良くある事例を一例を挙げます 。
Ajaxの非同期通信のコールバック関数として
まずは、これでしょう。Ajaxが簡単に書けます。
SampleAjax.hx
import haxe.Http;
class SampleAjax {
static function main() {
var http = new Http("piyopiyo.json");
http.onData = function( data:String ){
trace(data);
};
http.onError = function( data:String ){
trace(data);
};
http.request( false );
}
}
関数型プログラミングとして
ここに書くにはスペースが足りなさすぎる!!!
まとめ
関数値が扱かえるって良いよwww!
明日は、だれも書かない様子なら僕が書きまう。
土曜日は@shohei909さんです。よろしくおねがいします。