Closures如何在Scala中运行?

时间:2017-02-15 11:03:50

标签: javascript scala closures

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

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

scala中的闭包是否与javascript闭包相似?将参数发送到scala中的内部函数是否有效?

1 个答案:

答案 0 :(得分:4)

闭包是捕获定义它的外部作用域的函数,因此可以访问在其自己的作用域之外定义的实体。

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

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

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

另外,请注意Scala本身支持currying:

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)