Scala 中的初始数组元素?
Initial array elements in Scala?
class testing[T <: IntStorage : ClassTag] {
var the_array = Array.ofDim[T](10, 10)
}
如果 T 是抽象 class,我想知道在将任何元素放入其中之前“the_array”包含什么?那么数组的初始元素是什么?
如果数组也可以包含空元素,例如 None,该怎么办?我如何首先用所有“空”单元格初始化数组,即 None,然后填充某些行和列?
Scala,尽管它做对了所有事情,但不幸的是,它仍然隐藏着来自 Java 领域的最严重的罪犯:可怕的 null
价值,通常被称为十亿美元的错误。
在 Scala 中,每个 AnyRef
值(粗略地说,在 Java 中任何非原始值)都可以是 null
。这样做不是惯用的,任何经验丰富的 Scala 开发人员都会像避免瘟疫一样避免 null
。但它就在那里,就像一个幽灵,等待着在夜里跳起来咬毫无戒心的程序员。
Array.ofDim
returns 默认初始化值。对于 AnyVal
,这意味着它们的“零”值,因此 Array.ofDim[Int]
returns 一个零数组。对于 AnyRef
,这个 returns 一个 null
.
的数组
scala> var x = Array.ofDim[A](10) // Assuming A is some class
var x: Array[A] = Array(null, null, null, null, null, null, null, null, null, null)
理想情况下,您会希望立即用一些合理的东西填充数组。或者,更好的是,使用 Array.fill
方法,其工作方式完全相同,但允许您立即初始化数组值。
请注意,Scala 3 有一个名为 -Yexplicit-nulls
的可选编译器选项,它显式标记任何可能是 null
的值,并使其在类型系统中显式显示。不幸的是,即使在这种模式下,Array.ofDim
似乎仍然是 returns 和 Array[T]
,有效地使其类型成为 Scala 3 新空检查器中的一个谎言。我得出的结论是 ofDim
可能旨在作为分配空数组的“低级”原语,并且在大多数情况下可能应该使用 fill
,就像 asInstanceOf
是一个低级原语,应该避免使用模式匹配(或者干脆完全避免向下转换,理想情况下)。
class testing[T <: IntStorage : ClassTag] {
var the_array = Array.ofDim[T](10, 10)
}
如果 T 是抽象 class,我想知道在将任何元素放入其中之前“the_array”包含什么?那么数组的初始元素是什么?
如果数组也可以包含空元素,例如 None,该怎么办?我如何首先用所有“空”单元格初始化数组,即 None,然后填充某些行和列?
Scala,尽管它做对了所有事情,但不幸的是,它仍然隐藏着来自 Java 领域的最严重的罪犯:可怕的 null
价值,通常被称为十亿美元的错误。
在 Scala 中,每个 AnyRef
值(粗略地说,在 Java 中任何非原始值)都可以是 null
。这样做不是惯用的,任何经验丰富的 Scala 开发人员都会像避免瘟疫一样避免 null
。但它就在那里,就像一个幽灵,等待着在夜里跳起来咬毫无戒心的程序员。
Array.ofDim
returns 默认初始化值。对于 AnyVal
,这意味着它们的“零”值,因此 Array.ofDim[Int]
returns 一个零数组。对于 AnyRef
,这个 returns 一个 null
.
scala> var x = Array.ofDim[A](10) // Assuming A is some class
var x: Array[A] = Array(null, null, null, null, null, null, null, null, null, null)
理想情况下,您会希望立即用一些合理的东西填充数组。或者,更好的是,使用 Array.fill
方法,其工作方式完全相同,但允许您立即初始化数组值。
请注意,Scala 3 有一个名为 -Yexplicit-nulls
的可选编译器选项,它显式标记任何可能是 null
的值,并使其在类型系统中显式显示。不幸的是,即使在这种模式下,Array.ofDim
似乎仍然是 returns 和 Array[T]
,有效地使其类型成为 Scala 3 新空检查器中的一个谎言。我得出的结论是 ofDim
可能旨在作为分配空数组的“低级”原语,并且在大多数情况下可能应该使用 fill
,就像 asInstanceOf
是一个低级原语,应该避免使用模式匹配(或者干脆完全避免向下转换,理想情况下)。