【问题标题】:Initial array elements in Scala?Scala中的初始数组元素?
【发布时间】:2022-01-26 19:49:52
【问题描述】:
class testing[T <: IntStorage : ClassTag] {
  var the_array = Array.ofDim[T](10, 10)
}

如果 T 是抽象类,我想知道“the_array”在放入任何元素之前包含什么?那么数组的初始元素是什么?

如果数组也可以包含空元素怎么办,例如 None 。我怎样才能先用所有“空”(即无)单元格初始化数组,然后填充某些行和列?

【问题讨论】:

  • None 不是“空”。它是独立的object 和Option[X] 的一部分。

标签: arrays scala


【解决方案1】:

Scala,尽管它做对了所有事情,但不幸的是,它仍然窝藏着 Java 领域最严重的罪犯:可怕的 null 价值,通常被称为十亿美元的错误。

在 Scala 中,每个 AnyRef 值(粗略地说,Java 中的任何非原始值)都可以是 null。这样做并不习惯,任何经验丰富的 Scala 开发人员都会像瘟疫一样避免null。但它就在那里,就像一个幽灵,等着在夜间跳起来咬毫无戒心的程序员。

Array.ofDim 返回默认初始化值。对于AnyVal,这意味着它们的“零”值,因此Array.ofDim[Int] 返回一个零数组。对于AnyRef,这将返回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 似乎仍然返回一个Array[T],有效地使其类型成为 Scala 3 新的空检查器中的谎言。我的结论是ofDim 可能是作为分配空数组的“低级”原语,并且在大多数情况下应该使用fill,就像asInstanceOf 是一个低级原语一样应该避免这种情况以支持模式匹配(或者完全避免向下转换,理想情况下)。

【讨论】:

  • 我还要指出tabulate 也非常有用。 - 最重要的是,值得指出的是,Array 也是 Java 的另一个继承,应该首选适当的集合。
  • 只是一个挑剔:“每个 AnyRef 值都可以为空”大部分是正确的,但并不完全正确,这就是为什么当你想在泛型中处理可空值时需要编写 Ident &gt;: Null &lt;: AnyRef 之类的东西(见stackoverflow.com/questions/18054614/…)
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
相关资源
最近更新 更多