Scala 使用外部函数中的变量是一种好的做法吗?

Scala 使用外部函数中的变量是一种好的做法吗?,scala,functional-programming,coding-style,Scala,Functional Programming,Coding Style,我试图学习Scala编程语言 在内部函数中使用外部函数中的变量/参数是否是一种良好且流行的做法 例如: def foo(x: Int) = { val x2 = 10 def foo2() { // is it normal to use x and x2 here? } } 是的,在Scala中这叫做闭包。如果x一个x2在foo2范围内自由出现,您必须关闭提供两个变量值的开放项(foo2) 您可以访问在foo2外部定义的变量,从而在内

我试图学习Scala编程语言

在内部函数中使用外部函数中的变量/参数是否是一种良好且流行的做法

例如:

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

是的,在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
进行绑定。闭包这个名字源于通过向出现在其主体范围内的自由变量提供值来关闭开放项的行为

让我们看看如果我们不为
更多提供值会发生什么:

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

util,如果在
foo2
中以相同的名称定义变量,则可以访问外部函数
foo
变量。为什么你需要嵌套函数。?是的,我知道这是可能的,但我没有任何经验,也不知道它是否是正确的编码风格。这就是语言中支持嵌套函数的全部意义,不是吗?它不仅在Scala中被称为闭包:-)@Bergi你是对的,让我们假设lambda演算:)有任何编程语言使用这个概念,但不称之为“闭包”吗?如果像Javascript这样的语言使用这个术语,我会说不:P
scala> val more: Int = 4
more: Int = 4

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