我对Scala函数和闭包感到困惑

时间:2016-03-23 21:47:28

标签: scala

当我读到书时,我看到以下是一个功能:

val plusOne=(x:Int)=>x+1

好吧,当函数调用一个变量时,它变成了一个闭包: 以下是关闭:

val count=1
val plusOne=(x:Int)=>x+count

是吗 - 如果函数使用了任何变量,那么它将成为闭包吗?

3 个答案:

答案 0 :(得分:4)

不,那不对。

你在那里看到的只是一个嵌套的功能。 闭包的定义特征是它关闭其封闭的词法环境,从而延长了封闭环境中变量的生命周期,超出了封闭环境的生命周期。

请参阅此示例:

def makeAdder(inc: Int) = (x: Int) => x + inc

val threeAdder = makeAdder(3)

threeAdder(20) //=> 23
threeAdder(39) //=> 42

即使方法makeAdder已退出,因此局部变量inc已超出范围,makeAdder返回的闭包仍可访问它,因为它关闭了makeAdder的词汇环境。因此,带有自由变量的嵌套函数只要其封闭的词法范围结束就会变为一个闭包,并且它会从中逃脱。

答案 1 :(得分:0)

是的,这是对的。

您可以在TutorialsPoint: Scala closures上了解更多相关信息。

这个闭包的定义并不特定于scala。

答案 2 :(得分:-1)

我认为你的代码是错误的。 如果count是var ..就像..

var count = 1

然后在运行时创建并关闭plusOne的函数值,因此我们可以将其称为闭包。 但在您的示例中,count是val类型。所以函数值总是在编译时关闭..所以它不是闭包。