我有一个定义为
的函数def counter(x: Int) = {
var i = x
() => {
i = i + 1
println(i)
}
}
val count = counter(0)
所以count
是一个没有参数返回Unit的函数。然后在调用count
时可以省略括号。但是,如果我只是通过说count
来调用它,i
实际上就不会被添加而且没有任何反应。在此期间,编译器警告将被给予类似"纯表达式什么也不做,你可能省略括号"。
如果我用括号count()
来调用它,一切都很好,并且会打印i
。
为什么说count
不起作用?谢谢。
答案 0 :(得分:1)
您无法在没有括号的情况下调用函数。在scala
中,您可以在没有带括号的参数的情况下调用method
。方法,但不是功能。
实际上"呼叫功能"表示"类型为apply
&#34的对象的调用方法FunctionN
;在scala
。
所以count()
表示count.apply()
。您可以调用方法apply
,不要使用括号:count.apply
。
答案 1 :(得分:0)
你的计数器(x:Int)方法实际上返回函数()=> {...}已定义(返回Unit并生成编译器警告)。
因此,通过使用括号调用count,您实际执行该函数。
如果我进行desugar类型推断,您将获得:
def counter(x: Int): () => Unit = {
var i = x
() => {
i = i + 1
println(i)
}
}
val count: () => Unit = counter(0)
答案 2 :(得分:0)
Function0
与无参数方法完全不对应。也就是说:
val returnOne = () => 1
// approximates
def returnOne() = 1
// rather than
def returnOne = 1
事实上,一旦将无参数方法提升为Function0
,无参数方法行为就会丢失:
// Define a parameterless method
scala> def returnOne = 1
returnOne: Int
// Every time you reference the method it is evaluated
scala> returnOne
res2: Int = 1
// Lift the method to a Function0
scala> returnOne _
res3: () => Int = <function0>
// Now a reference to the lifted method evaluates to the lifted method
scala> res3
res4: () => Int = <function0>
// And you have to invoke it explicitly
scala> res3()
res5: Int = 1