在Haxe中将函数作为参数传递

14
在Haxe编程语言中,是否可以像JavaScript一样将函数作为参数传递?
例如,以下代码在Haxe中是否有效?
function a(){
    trace("This function is being used as a parameter!");
}

function b(theFunction){
    theFunction();
}

b(a); //is this equivalent to a(); ?

我不了解Haxe,但是在b(a)中,您用函数的定义替换了函数的名称。这两者几乎总是相同的。我说几乎总是因为如果Haxe尝试对函数参数进行某些有趣的操作(比如说a有一个参数,并且在将其作为参数传递时,Haxe的语义强制实施将参数缩减为某些正常形式...),可能会导致非终止。就目前而言,我想不到任何区别。 - user1666959
@user1666959 并非所有语言都允许将函数作为参数传递 - 例如,Java 不允许将函数作为参数传递。在 Haxe 中是否可能实现,还是不可能呢? - Anderson Green
2个回答

17

这绝对是可能的,并且是标准库中使用的一种模式,特别是在Lambda类中:

class Test {
  static function main(){
    var arr = [0,1,2,3,4,5,6,7,8,9,10];
    var newArr = Lambda.filter(arr, function (num) { 
      return num % 2 == 0; 
    });
    for (i in newArr)
    {
      trace (i);
    }
  }
}

(请参见http://try.haxe.org/#C9dF3

如果要定义接受函数作为参数的自己的方法,您可以使用(param1Type)->(param2Type)->(returnType)语法:

function test1(myFn:String->Void) { myFn("hi"); }
test1(function (str) { trace(str); });

function test2(myFn:String->String) { var newStr = myFn("hi"); }
test2(function (str) { return str.toUpperCase(); });

function test3(myFn:Int->String->Array<Int>->Void) { myFn(3, "Jason", [1,2,3,4]); }
test3(function(num:Int, name:String, items:Array<Int>) { ... });

9

谢谢 - 我忘记了可以在线测试Haxe代码 :) - Anderson Green
另一个非常快速的测试方法是编译到neko...只需使用"haxe -x MyTestClass.hx",它将生成"MyTestClass.hx.n"并一次性运行所有内容。这对于快速检查Haxe中某些功能的工作方式非常方便。 - Jason O'Neil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接