我尝试学习Scala编程语言。
在内部函数中使用外部函数的变量/参数是否是好的和流行的做法?
例如:
def foo(x: Int) = {
val x2 = 10
def foo2()
{
// is it normal to use x and x2 here?
}
}
答案 0 :(得分:4)
是的,在Scala中称为闭包。如果x
x2
在foo2
范围内显示空闲,则必须关闭该开放字词(foo2
),并提供两个变量的值。
您可以访问在foo2
之外定义的变量,从而在内部函数的范围内显示为自由变量。例如,请考虑:
// some context
val more: Int = 4
def sumMore(x: Int): Int = x + more
在最后一行中,我们x
是一个绑定变量,more
在sumMore
函数中显示为自由变量。
任何具有自由变量的函数文字(如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
^
如果more
在sumMore
范围内(在外部定义),该怎么办:
scala> val more: Int = 4
more: Int = 4
scala> def sumMore(x: Int): Int = x + more
sumMore: (x: Int)Int