伙计们,我正在尝试学习 Scala,我使用 IntelliJ IDEA 来做到这一点,问题是我在互联网上看到了一段代码,其中方法定义如下:
def move(dx: Int, dy: Int, dz: Int) {}
但是当我尝试在 IntelliJ IDEA 中定义方法时,它会在大括号之前自动添加:“Unit =”,我不知道这是什么意思?像这样 :
def move(dx: Int, dy: Int, dz: Int): Unit ={}
感谢您的帮助
最佳答案
过程语法
def methodName(arg1: Type1, ..., argN: TypeN) {
/* method body */
}
只是返回类型为
Unit
的方法的语法糖。它相当于def methodName(arg1: Type1, ..., argN: TypeN): Unit = {
/* method body */
}
Unit
类型包含一个值:空元组 ()
。因此,除非该方法通过抛出异常或错误异常退出,否则它会返回空元组 ()
。这反过来意味着方法的返回值并不重要,因为除了方法终止之外,它不包含任何有意义的信息。因此,它通常用于仅因副作用而执行的方法。正如 Emre Sevinç 正确指出的那样,不应再使用过程语法,它可以帮助您避免键入六个字符,但会使整个语法变得不那么一致,因此并不值得。
这不是一个答案,而是试图理清有关
Unit
与 void
的混淆。 虽然乍一看
Unit
的使用方式似乎与 void
在 C
等语言中的使用方式相同,但实际上完全不同,因为 Unit
实际上确实有一个值,而 void
中通常(令人困惑)没有 C
类型的值-类语言。这使得从 Unit
构造更复杂的值成为可能。例如,List( (), (), (), (), () )
是
List[Unit]
类型的值,可以表示自然数。相似地,Left( () ); Right( () )
是
Either[Unit, Unit]
类型的值,可以表示 bool 值。这两个例子显然是人为的。 “Scala 中的函数式编程”(P. Chiusano,R. Bjarnason)中提供了一个更实质和实际的示例,其中 ()
在从 map
类型类中的 map2
派生 Applicative[F[_]]
时派上用场:def map[B](fa: F[A])(f: A => B): F[B] =
map2(fa, point( () ))((a, _) => f(a))
// ^
// |
// Here is it
(这在没有上下文的情况下是不应该被理解的:我只想提供一个具体的例子,
()
可用于在非常通用的框架中定义非常基本的方法)从高层次的角度来看,在语言中拥有类型
Unit
是一件非常好的事情,因为它使类型和函数的类别成为 cartesian closed (它是定义第一部分的“终端对象”)。这使得语言整体上更加一致和对称。
关于scala - 为什么在Scala中定义方法时添加了 ": Unit = "?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49647276/