繁体   English   中英

在Scala中返回代码块

[英]Returning code block in Scala

我试图在Neal Ford在Groovy中进行的Functional Thinking演示文稿中的Scala中实现闭包示例。 请参阅幻灯片#43和44 https://sea.ucar.edu/sites/default/files/Functional_Thinking.pdf

  def makeCounter : Unit = {
var localVar = 0
return { localVar += 1 }
}

此代码返回一个匿名函数。 现在,我想通过调用此匿名函数来增加localVar。

我有两个问题:
1.如何调用匿名函数?
2.调用后,如何检查localVar的值是否增加?

首先,我尝试了这个-
val c1 = makeCounter()。 它引发以下错误:
错误:单位类型的makeCounter不接受参数

然后我尝试了这个。
val c1 = makeCounter

这没有给出任何错误。 仅打印c1:单位=()。

然后,
print(c1)print(),而c1()给出了相同的错误。

首先。 不要使用return ,Scala中的语义与Java或Groovy中的语义完全不同。

Unit类型不是匿名函数的同义词。 这更像是副作用的征兆。

匿名函数的类型为() => A 在您的情况下,您需要一个不返回任何东西但会产生副作用的函数。 所以它的类型应该是() => Unit

让我们看一些代码:

def makeCounter : () => Unit = { 
  var x = 0 
  { () => x = x + 1 } 
}

val counter = makeCounter
counter(); counter(); counter()

大! 我们做了makeCounter给我们一个新鲜的柜台!

只有一个问题。 xmakeCounter方法中的局部变量,因为它从未返回,所以我们看不到它的值! 曾经! 例如,我们可以从方法中删除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())

您将看到“ 1、2、3”两次。 每个计数器一次。

我没有看演示,所以我不知道这是功能性思维还是功能性思维中的一张幻灯片,但是:

scala> def f: () => Int = {
     | var v = 0
     | () => v += 1 ; v }
f: () => Int

scala> val g = f
g: () => Int = <function0>

scala> g()
res0: Int = 1

scala> g()
res1: Int = 2

scala> g()
res2: Int = 3

f返回的函数文字当然是paren之后的所有内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM