我的理解是Unit
= void
,但为什么我可以传入多个参数?
那么任何人都可以解释为什么以下代码有效吗?
def foo(x: Unit) = println("foo")
foo("ss", 1)
我的理解是Unit
= void
,但为什么我可以传入多个参数?
那么任何人都可以解释为什么以下代码有效吗?
def foo(x: Unit) = println("foo")
foo("ss", 1)
如果您运行代码片段,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 的代码块。
我看不出这种行为的充分理由,我宁愿抛出编译器错误。
一个相关的问题给出了一个不错的答案:
来自Scala 语言规范 v2.9的第 6.26.1 节,“值丢弃”:
如果 e 具有某个值类型并且预期类型是 Unit,则通过将 e 嵌入到术语 { e; 中将其转换为预期类型。() }。
因此,在您的情况下,似乎 ("ss", 1) 正在转换为元组,以便可以将其视为单个参数,然后由于该参数类型不是 Unit,因此将其转换为计算该元组的块value 然后返回单位以匹配所需的参数类型。