我的理解是Unit
= void
,但为什么我可以传递多个参数?
那么有人可以解释为什么以下代码有效吗?
def foo(x: Unit) = println("foo")
foo("ss", 1)
Run Code Online (Sandbox Code Playgroud)
Mal*_*off 19
如果你运行你的代码片段,scala -print
你将大致得到代码的以下输出:
/* Definition of foo */
private def foo(x: scala.runtime.BoxedUnit): Unit = {
/* Invocation of foo */
foo({
new Tuple2("ss", scala.Int.box(1));
scala.runtime.BoxedUnit.UNIT
});
Run Code Online (Sandbox Code Playgroud)
如您所见,将参数foo
重写为创建元组但随后返回UNIT的代码块.
我无法看到这种行为的充分理由,而是宁愿抛出编译器错误.
一个相关的问题给出了一个合适的答案在这里:
从Scala语言规范v2.9的6.26.1节,"价值丢弃 ":
如果e具有某种值类型且期望的类型是Unit,则通过将e嵌入到术语{e;中来将e转换为期望的类型.()}.
所以,在你的情况下,似乎("ss",1)被转换为一个元组,以便它可以被视为一个参数,然后当该参数类型不是Unit时,它被转换为计算该元组的块value然后返回单位以匹配所需的参数类型.