Kim*_*bel 16
在计算机科学中,闭包是一个具有自由变量的第一类函数,它们在词法环境中受到约束.
您不需要维基百科文章中的这句话.Java缺少的(除了丑陋的语法之外)是从闭包外部绑定自由变量的功能.一个例子:
int x = 0;
new Runnable() {
public void run() {
x = 1;
}
}.run();
Run Code Online (Sandbox Code Playgroud)
这里Java编译器会抱怨变量x.
scala中的同样的东西工作正常,并且不那么冗长:
var x = 0
val fun = ()=>{x=1}
fun
Run Code Online (Sandbox Code Playgroud)
由于我觉得自己是初学者(与DPP和Amber相比),我可以用初学者语言向初学者解释:
首先,匿名函数(或代码块/ lambda表达式)只是一个没有名称的函数.它可以绑定到这样的变量.
scala> val foo = (x: Int) => 2*x
foo: (Int) => Int = <function1>
scala> val bar = foo
bar: (Int) => Int = <function1>
scala> bar(5)
res2: Int = 10
Run Code Online (Sandbox Code Playgroud)
你看,该函数没有名称foo,它可以从bar调用.
其次,闭包是一个匿名函数,它有一个未在函数内定义的变量(变量/值必须在定义函数之前声明).术语"完全动力闭合"可能指的是此功能.
scala> var constant = 7
constant: Int = 7
scala> val foo = (x: Int) => 2*x + constant
foo: (Int) => Int = <function1>
scala> foo(5)
res3: Int = 17
scala> constant = 6
constant: Int = 6
scala> foo(5)
res4: Int = 16
Run Code Online (Sandbox Code Playgroud)
第一次看到这个,你可能想知道它有什么好处.简而言之,它有许多应用领域:-)