gpt4 book ai didi

scala - 为什么 Unit 是其他任何东西的父类(super class)型?

转载 作者:行者123 更新时间:2023-12-04 17:31:18 24 4
gpt4 key购买 nike

这是一个例子:

$ scala
Welcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_112).
Type in expressions for evaluation. Or try :help.

scala> val a: Unit = 1
<console>:11: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
val a: Unit = 1
^
a: Unit = ()

在 Scala 文档中:

There is only one value of type Unit, ()

为什么 Scala 编译器默默地将值强制转换为 Unit?

一些上下文:我使用 Future[Unit] 类型来描述一些不返回任何内容的过程。由于 Future[Unit] 现在实际上是 Unit 的子类型,我遇到了一些有趣的错误 (someFuture.map(a => Future(a) ) 静静地跳过调用操作而不是给出编译警告)。我应该使用什么作为不返回任何有意义结果的操作类型?

最佳答案

Unit不是其他类型的父类(super class)型。相反发生的事情称为值丢弃:当表达式的预期类型为 e 时是Unit ,编译器将其替换为 {e; ()} .这样做是为了使某些行为更加熟悉。例如。

val sb = new StringBuilder
val strings: List[String] = ...
for (str <- strings) { sb.append(str) }

类比for在其他语言中循环,我们希望它能够编译。但如果不丢弃值(value),它就不会:这相当于 strings.foreach(str => sb.append(str)) , str => sb.append(str) 的类型是String => StringBuilder (因为 append 上的所有 StringBuilder 方法都返回构建器本身)和 foreachList[String]需要 String => Unit .

您可以添加 -Ywarn-value-discard编译器选项会在它发生时警告您(并显式写入 for (sb <- sbOpt) { sb.append("a"); () })。

或者您实际上可以使用 a trick定义你自己的 Unit (可能更改名称以避免任何阅读您代码的人混淆):

 object Unit 
type Unit = Unit.type

implicit def unit2scalaunit(a: Unit): scala.Unit = ()
implicit def scalaunit2unit(a: scala.Unit): Unit = Unit

这应该避免遇到 Future 的问题你描述。

关于scala - 为什么 Unit 是其他任何东西的父类(super class)型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40354834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com