取单元类型参数的函数

时间:2016-11-08 22:12:38

标签: scala

一般来说,我想了解Scala如何推断出一个带有Unit类型参数的函数的参数,当调用时省略()

this question中给出了一个例子:

val fun1: Unit => Int = u => 5

可以通过以下方式调用它:

fun1()

这是如何编译的?将()推断为参数而不是函数调用,即作为fun1(())中的内括号?

@ ThaDon在没有提供答案的情况下问了同样的问题。

此外,我发现这不起作用:

scala> def unit = ()
scala> fun1 unit
<console>:12: error: value unit is not a member of Unit => Int
   fun1 unit
        ^

但是这个:

scala> fun1 ()
warning: there was one deprecation warning; re-run with -deprecation for details
res5: Int = 5

和这个

scala> fun1(unit)
res3: Int = 5

都工作。

fun1 unit我错过了什么?编译器如何解析此代码?

2 个答案:

答案 0 :(得分:1)

  

这是如何编译的?是()推断为参数而不是函数调用,即作为fun1(())中的内括号?

是。请注意there was one deprecation warning; re-run with -deprecation for details。如果你重新运行,你会看到编译器会告诉你到底发生了什么:

[warn] /tmp/rendererUa1FraPj2B/src/main/scala/test.scala:7: Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want.
[warn]         signature: Function1.apply(v1: T1): R
[warn]   given arguments: <none>
[warn]  after adaptation: Function1((): Unit)
[warn]   fun1()
[warn]       ^

答案 1 :(得分:0)

带有args的函数需要在Scala中应用括号

为了调用带参数的函数,必须在函数名后面加上括号。

例如

fun1(unit)

fun1 unit但不是{{1}}