Scala 什么是全动力关闭?

Scala 什么是全动力关闭?,scala,theory,closures,definition,Scala,Theory,Closures,Definition,前几天,我在Scala上参加了一个Java会议,发言者提到了“全功能关闭”。我很难确定一个对我有意义的定义。我读了上的维基页面,但它确实没有为我解答。有人能帮我一个明确的定义吗?甚至可能包括一个简单的例子 谢谢 说话者可能使用了“full-powered”来表示与“closure-like”相反的意思,这就是。据我所知,full-powered closures并没有什么特别的意思,但它可能意味着:语法简单。在Java中创建一个匿名内部类与使用(a=>avalfoo=(x:Int)=>2*x f

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


谢谢

说话者可能使用了“full-powered”来表示与“closure-like”相反的意思,这就是。

据我所知,full-powered closures并没有什么特别的意思,但它可能意味着:语法简单。在Java中创建一个匿名内部类与使用(a=>a 在计算机科学中,闭包是一类具有自由变量的函数,它 在词汇环境中进行绑定

你只需要维基百科文章中的这句话。Java缺少的(除了难看的语法)是从闭包外部绑定自由变量的特性。例如:

int x = 0;
new Runnable() {
    public void run() {
        x = 1;
    }
}.run();
在这里,Java编译器会抱怨变量x

在scala中,同样的事情也可以很好地工作,而且不那么冗长:

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

因为我觉得自己像个初学者(与民进党和琥珀相比),我可以用初学者的语言向初学者解释:

首先,匿名函数(或代码块/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
scala>valfoo=(x:Int)=>2*x
foo:(Int)=>Int=
scala>val bar=foo
条:(Int)=>Int=
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
scala>var常量=7
常数:Int=7
scala>valfoo=(x:Int)=>2*x+常数
foo:(Int)=>Int=
scala>foo(5)
res3:Int=17
scala>常数=6
常数:Int=6
scala>foo(5)
res4:Int=16

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

该示例不是一个闭包(它不会从上下文中捕获任何变量)。然而,如果有一个例子使用了更轻量级的语法,并且是一个完结,那么你会得到一个完全正确的答案(因为我还怀疑说话人说的是更容易使用的语法)。@Richard,是的,他说的是让事情变得更不冗长,这很好。尽管“全功率”可能意味着很多,我认为这显然意味着它比单纯的匿名函数更强大。因为方便的语法并不能使闭包更强大,所以我不认为这是什么意思。@Kim:我在某种程度上理解你的观点,但当我相信当语法感觉更无缝、更不冗长时,在许多情况下它会更强大。这正是我所寻找的。非常感谢@杰斯珀:不,如果我考进x决赛就不行了。我只会收到一条不同的错误消息。;)我可以用一个元素将x做成一个final int数组…@Jesper,从
Runnable
中对
final
数组内容所做的修改将在数组可见的每个范围内可见。