什么()在Scala中意味着什么?

时间:2015-09-24 22:39:04

标签: scala

我找到了一个Scala代码段,它声明了一个方法<init>并将()放在调用之下。

我对第5行有疑问。()在这里是什么意思?

(() => {
  final class $anon extends MutableProjection {
    def <init>() = {
      super.<init>();
      ()
    };
    ...
  };
  new $anon()
})

以下是code的完整示例。

2 个答案:

答案 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空参数的区别对我来说过去很尴尬,所以希望能揭开它的神秘面纱。