2014-04-02 40 views
1

如果將方法作爲funarg傳遞,如何判斷傳遞的函數是否是方法,並獲取方法的this對象?如何從傳遞的方法獲得`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); 
    } 
} 

回答

4

你不能也沒有辦法檢索this。但在我看來,這似乎是一種反模式,試圖做到這一點。如果你想要的方法和容器,你可以定義一個typedef:

typedef F = { 
    f : Void -> Void 
} 

現在你有方法和容器。

+0

它在C或ECMAScript等語言中有所不同 - 函數具有隱含參數,因此您具有單獨的函數和所有者。 –

0

如果你想獲得一個方法的隱式'這個參數,你必須使它明確的,像這樣

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()}); 
} 

這是,實際上,相當的簡單:函數是一個函數,沒有牽連,方法調用者是方法調用者。

1

Haxe不提供跨平臺的方式來做到這一點,它通常不會被推薦。

但是,如果您最終需要此功能,則可以使用一些特定於平臺的方式。

上。例如JS下面的工作(至少在當前haXe的dev的版本):

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

它將返回對象,如果函數是一種方法和一種否則返回null。未指定調用非功能的結果。

相關問題