【问题标题】:How does Closures work in Scala?闭包在 Scala 中是如何工作的?
【发布时间】:2017-07-04 00:08:48
【问题描述】:

我理解闭包是一个函数,它的返回值取决于在其外部函数上定义的数据。在javascript中,我们可以像这样向内部函数发送参数

    add(x) {
       return addplus(y) {
                let z = this.x + y ;
                return z;
              }
    }
   var op = add(10)(20);

scala 中的闭包是否也类似于 javascript 闭包?在scala中向内部函数发送参数是否太有效?

【问题讨论】:

  • 您是在谈论 add 返回一个您将 y 作为参数传递的函数吗?
  • 嗯。对我来说,它看起来更像是 Currying 而不是闭包
  • 哦,是的,刚刚更新了问题。

标签: javascript scala closures


【解决方案1】:

闭包是一个捕获定义它的外部范围的函数,因此可以访问在其自身范围之外定义的实体。

闭包的一种可能用法是您所描述的,尽管利用它的技术(如评论中所述)称为currying,即使用n 参数作为一个函数建模一个参数返回一个函数,该函数采用n - 1 个参数。

您可以在 Scala 中逐行移植您的 Javascript 代码:

def add(x: Int): Int => Int =
  y => x + y

另外,请注意 Scala 原生支持柯里化:

def add(x: Int)(y: Int): Int =
  x + y

两者在语义上是等效的,通过部分应用它们中的任何一个,您将获得一个函数,该函数返回一个函数,该函数将 x 与其参数相加。它也可以完全应用。

val following: Int => Int = add(1)
val two = following(1)
val three = following(two)
val four = add(two)(two)

【讨论】:

  • 措辞好!为了完整起见,您可以添加有关部分应用函数的注释,作为实现相同目标的另一种方式。虽然您的 curried add 仍然可以被视为具有闭包 y => x + y,但使用 PAF 没有任何闭包,但您可以获得相同的功能(例如 def add(x: Int, y: Int): Int = x + y; val following: Int => Int = add(1, _))。不过,我仍然更喜欢柯里化......更多的功能和更少的下划线:)
  • 啊,看来我需要彻底阅读 scala 文档。你解释得很好。谢谢你的时间。
猜你喜欢
  • 2017-07-16
  • 2013-06-12
  • 2018-10-07
  • 1970-01-01
  • 2013-06-07
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多