Don';我不明白Scala闭包是如何工作的

Don';我不明白Scala闭包是如何工作的,scala,functional-programming,closures,Scala,Functional Programming,Closures,这里怎么了? 我创建了一个函数closureDemo,它接受另一个函数,该函数不接受任何参数,也不返回任何内容。 当我调用closureDemo时,我传递了一个符合此条件的函数。 但是我没有得到预期的输出。我期望得到以下结果:- This is a demo application this is a demo for closure 但只有第一行被打印出来。 有人能解释一下这是怎么回事吗 object ScalaApp { def main(args:Array[String]): U

这里怎么了? 我创建了一个函数closureDemo,它接受另一个函数,该函数不接受任何参数,也不返回任何内容。 当我调用closureDemo时,我传递了一个符合此条件的函数。 但是我没有得到预期的输出。我期望得到以下结果:-

This is a demo application
this is a demo for closure
但只有第一行被打印出来。 有人能解释一下这是怎么回事吗

object ScalaApp {

  def main(args:Array[String]): Unit = {
    println("This is a demo application")
    closureDemo {
      () => println("this is a demo for closure")
    }
  }


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


Amar

这是因为closureDemo采用了一个by-name参数。 在主函数中的closureDemo调用中,您只是创建/定义了一个无参数函数,而不是调用它。因此,通过强制计算新创建的函数,您可以得到预期的结果

closureDemo {
   (() => println("this is a demo for closure")).apply()
 }
或者,您也可以简单地调用,因为closureDemo的输入不是函数,而是按名称参数(代码块)


这是因为closureDemo采用了一个by-name参数。 在主函数中的closureDemo调用中,您只是创建/定义了一个无参数函数,而不是调用它。因此,通过强制计算新创建的函数,您可以得到预期的结果

closureDemo {
   (() => println("this is a demo for closure")).apply()
 }
或者,您也可以简单地调用,因为closureDemo的输入不是函数,而是按名称参数(代码块)


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

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

closureDemo(println("this is a demo for closure"))
如果您只想传递带有零参数的
closureDemo
函数,则其签名应反映:

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

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

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

closureDemo(println("this is a demo for closure"))
如果您只想传递带有零参数的
closureDemo
函数,则其签名应反映:

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

还应该注意的是,这里实际上没有使用任何闭包,只有不引用任何外部变量的函数。我接受了这个答案。谢谢你的解释我以为我在用闭包,但我想我最终会用到闭包的。还应该注意的是,这里没有真正使用的闭包,只有不引用任何外部变量的函数。我接受了这个答案。谢谢你的解释。我以为我在使用闭包,但我想我最终会达到目的。这与公认的答案是一致的。谢谢你帮我。这与公认的答案是一致的。谢谢你帮助我。