Scala 什么是全动力关闭?
前几天,我在Scala上参加了一个Java会议,发言者提到了“全功能关闭”。我很难确定一个对我有意义的定义。我读了上的维基页面,但它确实没有为我解答。有人能帮我一个明确的定义吗?甚至可能包括一个简单的例子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
谢谢 说话者可能使用了“full-powered”来表示与“closure-like”相反的意思,这就是。据我所知,full-powered closures并没有什么特别的意思,但它可能意味着:语法简单。在Java中创建一个匿名内部类与使用(a=>a
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
数组内容所做的修改将在数组可见的每个范围内可见。