为什么以下scala代码有效?

How*_*ard 9 scala

我的理解是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的代码块.

我无法看到这种行为的充分理由,而是宁愿抛出编译器错误.

  • 如果定义`foo(x:(String,Int))`那么你可以用一对参数调用它,这些参数会自动被tupled.因为任何东西都可以传入`Unit`,所以元组转换似乎与你演示的方式完全一致.我也不确定我是否喜欢这个,但也许错误在于自动整理? (2认同)

iai*_*gin 5

一个相关的问题给出了一个合适的答案在这里:

Scala:为什么我可以将Int转换为Unit?

Scala语言规范v2.9的6.26.1节,"价值丢弃 ":

如果e具有某种值类型且期望的类型是Unit,则通过将e嵌入到术语{e;中来将e转换为期望的类型.()}.

所以,在你的情况下,似乎("ss",1)被转换为一个元组,以便它可以被视为一个参数,然后当该参数类型不是Unit时,它被转换为计算该元组的块value然后返回单位以匹配所需的参数类型.