一般来说,我想了解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
我错过了什么?编译器如何解析此代码?
答案 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)
为了调用带参数的函数,必须在函数名后面加上括号。
例如
fun1(unit)
fun1 unit
但不是{{1}}