2017-07-12 7 views
2

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 IntAny 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?

+0

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

Antwort

5

Es funktioniert nicht, weil Sie es den Typ nicht ableiten lassen.

Ersetzen Sie case h: Array[Any] mit case h: Array[_] und Sie sind golden.

0

Array ist eine Java-Klasse, nicht scala Klasse

Es ist nicht

Siehe http://docs.scala-lang.org/tutorials/tour/variances.html

+0

Wirklich? Aber ich lese über die 'Array'-Klasse in der Scala-Dokumentation. Bitte überprüfen Sie diesen Link http://www.scala-lang.org/api/2.12.1/scala/Array.html. – eg04lt3r

+1

seine Laufzeitklasse ist Java-Klasse, alle zusätzlichen Member-Funktion wird zur Kompilierzeit übersetzt. und das wichtigste ist es definiert als 'Array [T]' nicht 'Array [+ T]' –