( Hinweis : Ich verwende hier Scala 2.7.7, nicht 2.8).
Ich tue etwas ziemlich einfach - Erstellen einer Karte basierend auf den Werten in einer einfachen, 2-Spalten-CSV-Datei - und ich habe es leicht genug abgeschlossen, aber ich bin perplex, warum mein erster Versuch nicht kompilieren. Hier ist der Code:
// Returns Iterator[String]
private def getLines = Source.fromFile(csvFilePath).getLines
// This doesn't compile:
def mapping: Map[String,String] = {
Map(getLines map { line: String =>
val pairArr = line.split(",")
pairArr(0) -> pairArr(1).trim()
}.toList:_*)
}
// This DOES compile
def mapping: Map[String,String] = {
def strPair(line: String): (String,String) = {
val pairArr = line.split(",")
pairArr(0) -> pairArr(1).trim()
}
Map(getLines.map( strPair(_) ).toList:_*)
}
Der Compilerfehler lautet
CsvReader. error: Wert toList ist kein Mitglied von (St ring) => (java.lang.String, java.lang.String) [scalac] möglich Ursache: vielleicht fehlt ein Semikolon vor `Wert toList'? [scalac]
}.toList:_*) [scalac] ^
[scalac] ein Fehler gefunden
Was ist also los? Sie scheinen mir äquivalent zu sein, abgesehen von der expliziten Funktionsdefinition (im Gegensatz zu anonymous in dem nicht funktionierenden Beispiel) und () im Gegensatz zu {}. Wenn ich im nicht funktionierenden Beispiel die geschweiften Klammern durch Klammern ersetze, lautet die Fehlermeldung "';' erwartet, aber 'val' gefunden." Entferne ich jedoch die Definition der lokalen Variablen und teile die Zeichenkette zweimal UND verwende Klammern anstelle der geschweiften Klammern, lässt sich das Programm kompilieren. Kann mir jemand diesen Unterschied erklären, vorzugsweise mit einem Link zu Scala-Dokumenten, die den Unterschied zwischen Parens und geschweiften Klammern erklären, wenn sie verwendet werden, um Methodenargumente zu umgeben?