在Scala中返回代码块

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()给出相同的错误.

ped*_*rla 6

首先.不要使用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".每个柜台一次.