[英]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给我们一个新鲜的柜台!
只有一个问题。 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())
您将看到“ 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.