不明白Scala闭包是如何工作的

时间:2017-02-25 20:14:35

标签: scala functional-programming closures

这里有什么问题? 我创建了一个函数closureDemo,它接受另一个函数,它不接受任何参数并且不返回任何东西。 当我调用closureDemo时,我传递一个符合此条件的函数。 但我没有得到预期的输出。我期待以下输出: -

function  createDiv (array) {
    var i;
    var target = document.getElementById("container");
    for(i = 0; i < array.length; i++) {       
        target.appendChild("<div>" + array[i] + "</div>");
    }
}

但只有第一行被打印出来。 有人可以解释一下这里发生了什么

This is a demo application
this is a demo for closure

谢谢,

阿玛尔

2 个答案:

答案 0 :(得分:3)

op参数closureDemo是按名称调用的,这意味着在您调用它之前不会对其进行评估。这很好,因为你在main中调用它,但是,你正在传递() => println(...),这是一个零参数的函数。在closureDemo的主体内,对op的调用返回一个函数,但不调用该函数。

如果您希望closureDemo保持按名称调用,则不应将其传递给函数,如下所示:

closureDemo(println("this is a demo for closure"))

如果您只想传递closureDemo函数,而您希望稍后调用零参数,则其签名应反映出:

def closureDemo(op: () => Unit) = {
  op()
}

答案 1 :(得分:2)

这是因为closureDemo演示采用了一个名字参数。 并且在main函数的closureDemo调用中,您只是创建/定义一个无参数函数而不调用它。因此,通过强制评估新创建的函数,您将获得预期的结果

closureDemo {
   (() => println("this is a demo for closure")).apply()
 }

或者你可以简单地调用,因为你对closureDemo的输入不是一个函数,而是一个名字参数(代码块)

closureDemo(println("this is a demo for closure"))