代码之家  ›  专栏  ›  技术社区  ›  Ronald

Scala中的初始数组元素?

  •  1
  • Ronald  · 技术社区  · 4 年前
    class testing[T <: IntStorage : ClassTag] {
      var the_array = Array.ofDim[T](10, 10)
    }
    

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

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

    1 回复  |  直到 4 年前
        1
  •  3
  •   Silvio Mayolo    4 年前

    尽管Scala做得很好,但不幸的是它仍然窝藏着Java领域中最坏的罪犯:可怕的罪犯 null 价值,通常被称为十亿美元的错误。

    在Scala,每个 AnyRef 无效的 . 这样做并不习惯,任何经验丰富的Scala开发人员都会避免这样做 就像瘟疫一样。但它就在那里,就像一个幽灵,等待着在夜里跳起来咬毫无戒心的程序员。

    Array.ofDim 返回默认的初始化值。对于 AnyVal ,这意味着它们的“零”值,所以 Array.ofDim[Int] ,这将返回 .

    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 无效的 大堆对外直接投资 Array[T] 即使在这种模式下,Scala 3新的空检查程序也有效地使其类型成为谎言。我的结论是 ofDim 很可能是用于分配空数组的“低级”原语,而且 fill 在大多数情况下,可能应该以相同的方式使用 asInstanceOf 是一个低级原语,应该避免使用它,以利于模式匹配(或者简单地避免完全向下转换,理想情况下)。

    推荐文章