Warum Scalas Musterbearbeitung funktioniert nicht in for-Schleifen für die Typanpassung?

8

Ich kodiere gegen eine API, die mir Zugriff auf das entfernte Dateisystem gibt. Die API gibt eine Liste von Dateien und Verzeichnissen als Liste von Knotenobjekten zurück (übergeordnet nach Datei und Verzeichnis).

Ich möchte nur auf Verzeichnissen arbeiten und Dateien ignorieren. Ich habe versucht, Mustererkennung in for loop zu verwenden, aber es funktioniert nicht:

%Vor%

Hier ist ein ähnliches Beispiel, das grundlegende scala-Objekte verwendet, um es ohne Abhängigkeiten auszuführen:

%Vor%

Ich benutze einen regulären Mustervergleich in der for-Schleife und das funktioniert gut:

%Vor%

Frage:

Können Sie mir sagen, warum das erste / zweite Beispiel in scala 1.9 nicht funktioniert?

In der "Programmierung in Scala" wird die for -Schleife beworben, um den gleichen Mustervergleich wie match zu verwenden, damit es funktioniert.

Wenn das "for" und "match" anders sind, wäre es großartig, wenn Sie mich auf Artikel mit mehr Details hinweisen könnten. Was ist mit Mustererkennung in der Zuordnung?

Aktualisierung:

Ich kann keine Antwort akzeptieren, die besagt, dass es unmöglich ist, Elemente in for-Schleife zu überspringen, da dies im Widerspruch zu "Prog. in scala" steht. Hier ist ein Fragment aus Abschnitt 23.1:

  

pat <- expr ... Das Muster pat wird nacheinander allen Elementen dieser Liste zugeordnet. ... wenn die Übereinstimmung fehlschlägt, wird kein MatchError geworfen. Stattdessen wird das Element einfach aus der Iteration ausgeschlossen

und tatsächlich funktioniert das folgende Beispiel gut:

%Vor%

Warum funktioniert die Typübereinstimmung nicht?

    
Piotr Czapla 09.07.2012, 11:20
quelle

3 Antworten

12

Dies ist die langdauernde Ausgabe 900 und wurde schon oft diskutiert. Die übliche Problemumgehung besteht darin, Folgendes zu verwenden:

%Vor%

Eine schönere Version wird von Jason Zaugg in den Kommentaren zum oben genannten Ticket zur Verfügung gestellt:

%Vor%     
Niklas B. 09.07.2012, 13:05
quelle
1

Was Sie tun möchten, ist im Wesentlichen: iterieren Sie über alle Elemente von workarea.getChildren() , die vom Typ CSDir sind (mit anderen Worten: einige Kriterien erfüllen). Gewöhnliche Schleife / zum Verständnis iteriert über alle Elemente. Sie können nicht sagen: Iterieren Sie alle Elemente dieses Typs und überspringen Sie andere. Sie müssen expliziter sein.

Worüber denken Sie:

%Vor%

Es tut genau das, was Sie wollen: collect alle Elemente von workarea.getChildren() und für jedes von ihnen rufen Sie println .

auf     
Tomasz Nurkiewicz 09.07.2012 11:27
quelle
0

Wie wäre es damit:

%Vor%     
Londo 19.06.2015 18:50
quelle

Tags und Links