本文翻译自 # What does () mean in Scala?
译者:耐心的农夫2020
时间:2020-03-30 10:46:00
问题
我这有一段 Scala 代码,这段代码声明了一个 <init>
方法,并且将小括号 ()
放在了方法体中。
下面这段代码中第 5 行中的小括号是什么含义呢?
(() => {
final class $anon extends MutableProjection {
def <init>() = {
super.<init>();
()
};
...
};
new $anon()
})
回答 1
每个 Scala 函数都有返回值类型。按照惯例(同时也是一些语言特性强烈鼓励的),不需要返回任何值的函数有一个称为 Unit
的返回值类型,该类型有一个单例值,写作小括号 ()
。函数体中最后一个表达式就是函数的返回值。作者将返回值指定为小括号 ()
目的是让编译器推断出返回值类型应该是 Unit
。但是使用类型注释即可以做到这一点。如果一个函数的返回值类型是 Unit
,无论函数体中最后一条语句是什么,Scala 都会从函数中隐式返回小括号 ()
。所以,下面的代码
def <init>() = {
super.<init>()
()
}
可以等价写成
def <init>(): Unit = super.<init>()
回答 2
根据上下文,小括号 ()
可以有不同的含义。
作为值,它可以表示空的 tuple
或者 单例类型 Unit
的值。
它也可以表示不接受任何参数的函数或者方法,例如:
def foo() = "Hello world"
注意当定义匿名函数的时候,小括号 ()
本身仍然表示一个无参数函数。
val x = () => 2
上面表达式中,x
的类型是 () => Int
,一个不接受任何参数并且返回整型值的函数。
下面的例子是无穷困惑的来源:
val y = () => ()
这里 y
的类型是 () => Unit
而不是 Unit => Unit
,一个不接受任何参数并且返回 Unit
的函数。
如果定义 Unit => Unit
类型的函数,可以写成 val z = (x:Unit) => ()
,调用时写作 z(())
。
过去 Unit
和空参数之间的区别一直让我很困惑,希望上面的例子可以揭开一些神秘面纱。