scala - 为什么在Scala中定义方法时添加了 ": Unit = "?

标签 scala intellij-idea

伙计们,我正在尝试学习 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ç 正确指出的那样,不应再使用过程语法,它可以帮助您避免键入六个字符,但会使整个语法变得不那么一致,因此并不值得。

这不是一个答案,而是试图理清有关 Unitvoid 的混淆。

虽然乍一看 Unit 的使用方式似乎与 voidC 等语言中的使用方式相同,但实际上完全不同,因为 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/

相关文章:

scala - 利用 Scala 匹配表达式中案例类的类型约束

scala - Akka SLF4J logback 配置和使用

scala - 烫伤:成对比较字符串?

scala - 在 intellij 引用我在我使用过的类中实际没有使用的 scala 方法时出现错误

java - 智能 : rerun intermittently failing random test with previos run's data

java - IntellijIdea 无法自动重新加载 Web 应用程序(热部署)JSP 和 Javascript Debug模式下的更改

scala - 将列表转换为案例类

scala - Spark Scala:无法导入sqlContext.implicits._

java - 弹出窗口显示为空 intellij

scala - 无法在 IntelliJ 上创建 Scala 类