我找到了一个Scala代码段,它声明了一个方法<init>
并将()
放在调用之下。
我对第5行有疑问。()
在这里是什么意思?
(() => {
final class $anon extends MutableProjection {
def <init>() = {
super.<init>();
()
};
...
};
new $anon()
})
以下是code的完整示例。
答案 0 :(得分:5)
每个Scala函数都有一个返回类型。按照惯例(并且受到一些语言特性的高度鼓励),不需要返回任何内容的函数都有一个名为Unit
的返回类型,其单例值写为()
。
函数体中的最后一个表达式是其返回值。该作者使其()
使编译器推断返回类型应为Unit
。但是用类型注释来做这件事会更加清楚。如果函数的返回类型为Unit
,则无论函数中的最后一个语句是什么,Scala都将隐式地从函数返回()
。所以这个
def <init>() = {
super.<init>()
()
}
可以等效地编写为
def <init>(): Unit = super.<init>()
答案 1 :(得分:4)
()
可以根据具体情况进行一些操作。
作为一个值,它是一个空元组或单例类型。它的类型是Unit
。
它可以表示不带参数的函数或方法,例如:
def foo() = "Hello world"
请注意,在编写匿名函数时,()
本身就是一个没有参数的函数。
val x = () => 2
x
的类型是() => Int
,一个不带参数的函数并返回一个int。
作为无限混淆的来源,你可以得到这样的例子:
val y = () => ()
此处y
的类型为() => Unit
,不返回Unit
的参数,而不是Unit => Unit
的函数,它将被写为val z = (x:Unit) => ()
,并且称为z(())
单位vs空参数的区别对我来说过去很尴尬,所以希望能揭开它的神秘面纱。