class testing[T <: IntStorage : ClassTag] {
var the_array = Array.ofDim[T](10, 10)
}
如果 T 是抽象類,我想知道在將任何元素放入其中之前“the_array”包含什么?那么陣列的初始元素是什么?
如果陣列也可以包含空元素,例如 None 呢?我怎么能先用所有“空”(即無)單元初始化陣列,然后填充某些行和列?
uj5u.com熱心網友回復:
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應該避免使用模式匹配的低級原語一樣(或者干脆完全避免向下轉型,理想情況下)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/395615.html
