I Array von Any
Typ erstellen möchten, die wie folgt aussieht:Muster auf verschachtelte Arrays in Scala passend
val arr: Array[Any] = Array(Array(1, 2, Array(3)), 4)
Dann möchte ich es mit diesem Code Endrekursion machen glätten:
def flatten(xs: Array[Any]): Array[Any] = {
@tailrec
def makeFlat(xs: List[Any], res: List[Any]): List[Any] = xs match {
case Nil => res
case head :: tail => head match {
case h: Array[Any] => makeFlat(h.toList ::: tail, res)
case _ => makeFlat(tail, res :+ head)
}
}
makeFlat(xs.toList, Nil).toArray
}
Ich benutze Scala 2.12 Version.
Wenn die Iteration vom Quellen-Array zum internen Array Array(3)
kommt, funktioniert die Mustererkennung case h: Array[Any]
nicht. Das ist merkwürdig, weil sich Int
Any
erstreckt. Ich habe versucht zu debuggen und erkannte, dass dieses Array int[1]
(Array von primitiven Int) ist.
Warum scala entschied, es als primitives Array zu machen und wie ich diesen Fall herausfinden kann?
Scala den Typ des Array folgert (3) als Array [Int], da Sie unterstützt Varianzen speichern nur einen Int darin. Ihr Array-Typ [Any] bezieht sich nur auf das Array der obersten Ebene. val arr: Array [Beliebige] = Array (Array (1, 2, Array [Beliebig] (3)), 4) erstellt ein Array [Beliebig] für Array (3). – sheunis