Haxeの関数値について雑多なこと


さてさて、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さんです。よろしくおねがいします。