Warum funktioniert die Musterbearbeitung von Scala nicht in for-Schleifen für den Typabgleich?
Ich codiere gegen eine API, die mir Zugriff auf das Remote-Dateisystem gewährt. Die API gibt eine Liste von Dateien und Verzeichnissen als Liste von Knotenobjekten zurück (übergeordnet zu Datei und Verzeichnis).
Ich möchte nur an Verzeichnissen arbeiten und Dateien ignorieren. Ich habe versucht, den Mustervergleich zu verwendenfor
Schleife, aber es funktioniert nicht:
for {
dir: CSDir <- workarea.getChildren() // <-- I'm getting an error here complaining about type conversion
} {
println(dir)
}
Hier ist ein ähnliches Beispiel, in dem scala-Basisobjekte verwendet werden, um es ohne Abhängigkeiten auszuführen:
val listOfBaseObjects:List[Any] = List[Any]("a string", 1:Integer);
for (x: String <- listOfObjects) {
println(x)
}
Am Ende verwende ich einen regulären Pattern-Matching in der for-Schleife und das funktioniert einwandfrei:
// This works fien
for (child <- workarea.getChildren()) {
child match {
case dir: CSDir => println(dir)
case _ => println("do not nothing")
}
}
Frage:Können Sie mir sagen, warum das erste / zweite Beispiel in Scala 1.9 nicht funktioniert?
In der "Programmierung in Scala" derfor
Die Schleife wird angekündigt, um den gleichen Mustervergleich wie die zu verwendenmatch
so sollte es funktionieren.
Wenn das für und das Match unterschiedlich sind, wäre es toll, wenn Sie mich auf einige Artikel mit mehr Details verweisen könnten. Was ist mit Pattern Matching bei der Zuweisung?
Aktualisieren:Ich kann keine Antwort akzeptieren, die besagt, dass es unmöglich ist, Elemente in einer for-Schleife zu überspringen, da dies dem "Prog. In scala" widerspricht. Hier ist ein Fragment aus Abschnitt 23.1:
pat <- expr
... Das Musterpat
wird einzeln mit allen Elementen dieser Liste abgeglichen. ... wenn die Übereinstimmung fehlschlägt, wird kein MatchError ausgelöst. Stattdessen wird das Element einfach aus der Iteration entfernt
und in der Tat funktioniert das folgende Beispiel gut:
scala> val list = List( (1,2), 1, 3, (3,4))
scala> for ((x,y) <- list) { println (x +","+ y) }
1,2
3,4
Warum funktioniert der Schriftvergleich dann nicht?