AS3bind

これはなに?

boost::bind っぽく引数束縛を行う関数です。任意の関数の任意の引数を固定して新しい関数を生成します。
Flex のデータバインディングと名前が似ていますが全然別物です。
ライセンスは 修正BSD ライセンスです。

import org.libspark.as3bind.*; 
// * を使うのが嫌いな方もいると思いますが、
// グローバルなシンボルが多いのでこう書くことをお勧めします

function f(a:int, b:int):int { return a+b; }
var g:Funciton = bind(f, 2, 3);

g();  // f(2, 3) を呼び出したのと同じこと!

こんな風に使います。

リポジトリ

http://www.libspark.org/svn/as3/AS3bind/
http://www.libspark.org/svn/as3/AS3bind/as3bind.swc

bind 関数のフォーマット

bind(thisObj=_this, func, ... args)
thisObj
関数中で this に相当するオブジェクト 省略可
func
関数。直接渡すか thisObj のメンバ名で
args
束縛する引数

いくつかの例

  • 引数をとらない関数をイベントリスナへ
    // bind された関数は引数を可変長で取るので Event が渡されても無視します
    addEventListener(Event.ENTER_FRAME, bind(update));
    
  • 一部の引数だけ束縛
    // 「_1」~「_9」を渡すと関数呼び出し時に渡された引数に置き換わる
    var g:Function = bind(f, 2, _1);
    g(4);  // f(2, 4) を呼び出したのと同じこと!
    
  • 可変長引数にもちょっとだけ対応
    var g:Function = bind(f, 3, 4, _all);
    g(2, 3, 4, 5);  // f(3, 4, 2, 3, 4, 5) を呼び出したのと同じこと!
    
  • this を引数として束縛
    var g:Function = bind(f, _this);
    g.call(new Object());  // f(new Object()) と同じこと
    // もちろん...
    var obj:Object = {};
    obj.g = g;
    obj.g(); // こう書いても f(new Object()) と同じこと
    
  • this として束縛することもできる。
    var g:Function = bind(thisObj, f);
    g();  // f.call(thisObj) と同じこと。f 中で this は thisObj になる
    
  • this を束縛するなら文字列で関数名指定してもOK
    var g:Function = bind(thisObj, "check");
    f();  // thisObj.check() と同じこと。
    
  • array のコールバックとか
    array.every( bind(_1, "check") ); // 第一引数の check メソッドを呼び出したのと同じこと
    

注意点

  • 以下の場合例外は出ません
    var g:Function = bind(f, _2);
    g(1); // f(null) と同じこと
    
  • 束縛されたオブジェクトは生成された関数が GC されない限り GC されません

作ったのは

[ひだちのいろ](mail:hidachinoiro@ぢーめーる)