Var*_*nia 0 functional-programming scala anonymous-function
我试图在Scala中实现闭包示例,来自Neal Ford在Groovy中的Functional Thinking演示.参见幻灯片#43和44 https://sea.ucar.edu/sites/default/files/Functional_Thinking.pdf
def makeCounter : Unit = {
var localVar = 0
return { localVar += 1 }
}
Run Code Online (Sandbox Code Playgroud)
此代码返回匿名函数.现在我想通过调用这个匿名函数来增加localVar.
我有两个问题:
1.如何调用匿名函数?
2.调用后,如何检查localVar的值是否增加?
首先我尝试了这个 -
val c1 = makeCounter().它抛出以下错误:
错误:Unit类型的makeCounter不带参数
然后我尝试了这个.
val c1 = makeCounter
这没有给出任何错误.仅打印c1:单位=().
然后,
打印(c1)打印(),而c1()给出相同的错误.
首先.不要使用return,它的语义在Scala中完全不同于Java或Groovy.
该Unit类型不是匿名函数的同义词.它更像是副作用的指示.
匿名函数的类型是() => A.在你的情况下,你想要一个不返回任何东西的函数,但会产生副作用.所以它的类型应该是() => Unit.
我们来看一些代码:
def makeCounter : () => Unit = {
var x = 0
{ () => x = x + 1 }
}
val counter = makeCounter
counter(); counter(); counter()
Run Code Online (Sandbox Code Playgroud)
大!我们让makeCounter给我们一个新的柜台!
只有一个问题.x是方法中的局部变量,makeCounter因为它永远不会返回,我们无法看到它的价值!永远!例如,我们可以x从方法中删除,使其在外部范围内公开.但它不是很实用.相反,让我们让函数返回它:
def makeCounter : () => Int = { // Notice now, instead of Unit we use Int
var x = 0
{ () => x = x + 1; x }
}
val counter = makeCounter
println(counter(), counter(), counter())
val counter2 = makeCounter
println(counter2(), counter2(), counter2())
Run Code Online (Sandbox Code Playgroud)
你会看到两次"1,2,3".每个柜台一次.