【问题标题】:Don't understand how Scala closure works不明白 Scala 闭包是如何工作的
【发布时间】:2017-07-16 14:41:29
【问题描述】:

这里有什么问题? 我创建了一个函数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
  }
}

谢谢,

阿马尔

【问题讨论】:

    标签: scala functional-programming closures


    【解决方案1】:

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

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

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

    如果您只想传递带有零参数的closureDemo 函数,您希望稍后调用它,它的签名应该反映:

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

    【讨论】:

    • 还应该注意的是,这里并没有真正使用任何闭包,只是不引用任何外部变量的函数。
    • 我已经接受了这个作为答案。谢谢你的解释
    • 我以为我在使用闭包,但我想我最终会到达那里
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这与接受的答案一致。谢谢你帮助我。
    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多