使用外部函数的变量是一种好习惯吗?

时间:2018-03-13 13:54:27

标签: scala functional-programming coding-style

我尝试学习Scala编程语言。

在内部函数中使用外部函数的变量/参数是否是好的和流行的做法?

例如:

def foo(x: Int) = {
     val x2 = 10
     def foo2()
     {
         // is it normal to use x and x2 here?
     }
}

1 个答案:

答案 0 :(得分:4)

是的,在Scala中称为闭包。如果x x2foo2范围内显示空闲,则必须关闭该开放字词(foo2),并提供两个变量的值。

您可以访问在foo2之外定义的变量,从而在内部函数的范围内显示为自由变量。例如,请考虑:

// some context
val more: Int = 4
def sumMore(x: Int): Int = x + more

在最后一行中,我们x是一个绑定变量,moresumMore函数中显示为自由变量。

任何具有自由变量的函数文字(如sumMore,取决于more的值)将是一个开放的术语,因为它需要more的绑定。名称​​闭合源于通过为出现在其正文范围内的自由变量提供值来关闭开放期限的行为。

如果我们没有为more提供值,请看看会发生什么:

scala> def sumMore(x: Int): Int = x + more
<console>:7: error: not found: value more
       def sumMore(x: Int): Int = x + more
                                      ^

如果moresumMore范围内(在外部定义),该怎么办:

scala> val more: Int = 4
more: Int = 4

scala> def sumMore(x: Int): Int = x + more
sumMore: (x: Int)Int