9

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

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

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

2 回答 2

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
});

如您所见,to 的参数foo被重写为创建元组但随后返回 UNIT 的代码块。

我看不出这种行为的充分理由,我宁愿抛出编译器错误。

于 2012-10-12T10:21:29.720 回答
5

一个相关的问题给出了一个不错的答案:

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

来自Scala 语言规范 v2.9的第 6.26.1 节,“值丢弃”:

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

因此,在您的情况下,似乎 ("ss", 1) 正在转换为元组,以便可以将其视为单个参数,然后由于该参数类型不是 Unit,因此将其转换为计算该元组的块value 然后返回单位以匹配所需的参数类型。

于 2012-10-12T11:14:05.107 回答