为什么以下scala代码有效?

时间:2012-10-12 10:14:55

标签: scala

我的理解是Unit = void,但为什么我可以传递多个参数?

那么有人可以解释为什么以下代码有效吗?

def foo(x: Unit) = println("foo")                 
foo("ss", 1)  

2 个答案:

答案 0 :(得分: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
});

正如您所看到的,foo的参数被重写为一个代码块,该代码块创建一个元组,但随后返回UNIT。

我看不出这种行为的正当理由,而是宁愿抛出编译器错误。

答案 1 :(得分:5)

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

Scala: Why can I convert Int to Unit?

来自Scala Language Specification v2.9的第6.26.1节,“价值放弃”:

  

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

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

相关问题