什么是全动力闭合?

时间:2010-07-17 15:49:14

标签: scala theory closures definition

前几天我参加了Scala的Java会议,发言者提到了“全力关闭”。我很难确定一个对我有意义的定义。我已经阅读了closures上的维基页面,但它确实没有为我回答。有人可以用明确的定义来帮助我吗?甚至可能包括一个简单的例子。

谢谢!

4 个答案:

答案 0 :(得分:16)

  

在计算机科学中,闭包是具有自由变量的第一类函数   受到词汇环境的束缚。

您不需要维基百科文章中的这句话。 Java缺少的(除了丑陋的语法之外)是从闭包外部绑定自由变量的功能。一个例子:

int x = 0;
new Runnable() {
    public void run() {
        x = 1;
    }
}.run();

这里Java编译器会抱怨变量x。

scala中的同样的东西工作得很好,并且不那么冗长:

var x = 0
val fun = ()=>{x=1}
fun

答案 1 :(得分:9)

由于我觉得自己是初学者(与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

你看,该函数没有名称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

你第一次看到这个,你可能想知道它有什么好处。简而言之,它有许多应用领域: - )

答案 2 :(得分:2)

扬声器可能使用“全功率”来表示与“类似封闭”相反的情况,这就是many languages actually have

答案 3 :(得分:1)

据我所知,完全动力的闭包并不意味着什么特别,但它可能意味着:语法简单。在Java中新建匿名内部类与使用类似(a =&gt; a&lt; max)之类的东西之间存在着天壤之别。也许能够对所有周围变量形成闭包,而不仅仅是最终变量。