为什么函数调用永远不会被执行?

时间:2014-10-23 13:14:40

标签: scala

我有一个定义为

的函数
def counter(x: Int) = {
  var i = x
  () => {
    i = i + 1
    println(i)
  }
}

val count = counter(0)

所以count是一个没有参数返回Unit的函数。然后在调用count时可以省略括号。但是,如果我只是通过说count来调用它,i实际上就不会被添加而且没有任何反应。在此期间,编译器警告将被给予类似"纯表达式什么也不做,你可能省略括号"。

如果我用括号count()来调用它,一切都很好,并且会打印i

为什么说count不起作用?谢谢。

3 个答案:

答案 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