ChatGPT解决这个技术问题 Extra ChatGPT

在 Scala 中,'val a: A = _'(下划线)究竟是什么意思?

val a: A = _ 究竟将值初始化为什么?这是键入的 null 吗?谢谢。

Scala 的 symbol soup

P
Paul Butcher

val a: A = _ 是编译错误。例如:

scala> val a: String = _
<console>:1: error: unbound placeholder parameter
       val a: String = _
                       ^

起作用的是 var a: A = _(注意 var 而不是 val)。正如 Chuck 在他的回答中所说,这会将变量初始化为默认值。来自 Scala 语言规范:

如果 T 是 Int 或其子范围类型之一,则为 0,如果 T 是 Long,则为 0L,如果 T 是 Float,则为 0.0f,如果 T 是 Double,则为 0.0d,如果 T 是 Boolean,则为 false,如果 T 是 Unit,则为 (),对于所有其他类型为 null T。


哈,很好地抓住了 val/var 开关。我的大脑刚刚掠过它。
任何关于为什么这不能与 val 一起使用的见解?
@ErikAllik:这纯粹是猜测,但 val a: Int = _ 可能是编译错误,因为如果它有效,那将是不好的做法。这只是写 val a: Int = 0 的一种混淆方式。将 var 设置为默认值是有意义的,因为 var 预计会更改,但 val 是固定的,因此最佳做法是显式分配值。
@Shuklaswag:只有当你知道它是一个整数时。我正在尝试使用它来初始化我还不知道的类型的 val。
C
Chuck

它将 a 初始化为 A 类型的默认值。例如,Int 的默认值为 0,引用类型的默认值为 null。


混入 NotNull 特征的类的默认值是多少? :-)
@Jean-PhilippePellet:从 Scala 2.9.0.1(这是我使用的最新版本)开始,混入 NotNull 特征的类的默认值是 — 戏剧性的停顿 — null。我预计这可能会在某个时候改变,但目前似乎 _ 胜过 NotNull