怎么得到这个'从传递的方法

时间:2014-04-02 11:32:58

标签: haxe

如果将方法作为funarg传递,如何判断传递函数是否为方法,并获取方法的“this”对象是什么?

class A {
    public function f():Void{
        trace("f");
    }
}

class B {
    static function withFunarg(f:Void->Void):Void{
         //HERE
    }
    public static function main(){
         var a = new A();
         withFunarg(a.f);
    }
}

3 个答案:

答案 0 :(得分:4)

您不能并且无法检索this。但在我看来,这似乎是一种试图做到这一点的反模式。如果你想要方法和容器,你可以定义一个typedef:

typedef F = {
  f : Void -> Void
}

现在你有了方法和容器。

答案 1 :(得分:1)

Haxe并没有提供跨平台的方式来做到这一点,而且通常不会建议。

但如果您最终需要此功能,则可以使用某些特定于平台的方式。

例如,在js上,以下内容将起作用(至少在当前的haxe dev版本上):

  static function getThis(f:Dynamic):Dynamic{
    return (f.scope && f.method) ? f.scope : null;
  }

如果函数是方法,则返回对象,否则返回null。调用非功能的结果未指定。

答案 2 :(得分:0)

如果你想获得一个方法的隐含的'this'参数,你必须明确它,就像这样

static function withMethodFunarg(o:{}, f:{}->Void):Void{
    //HERE you have both object and function on this object
    trace(o);
    f(o);
}

public static function main(){
     var a = new A();
     withMethodFunarg(a,function(a){a.f()});
}

实际上,这很简单:函数是一个函数,没有含义,方法调用者是一个方法调用者。