2017-05-23 6 views
0

kann jemand helfen mir diesen Code zu verstehen, aus ...Code Erklärung für scala Platzhalter Aufruf benötigt

object FileMatcher { 
private def filesHere = (new java.io.File("C:/scalaTestcode")).listFiles 
private def fileMatching(matcher : String => Boolean) = 
{ 
    for(file <- filesHere; if matcher(file.getName)) yield file 
} 
def filesEnding(query:String) = 
    fileMatching {_.endsWith(query) } 
def filesContaining(query:String) = 
    fileMatching {_.contains(query)} 
def fileRegex(query:String)= 
    fileMatching {_.matches(query)} 
def main(args : Array[String]) 
{ 
    (filesEnding(".scala").toArray).foreach(println) 
} 
} 

Dieser Code korrekt funktioniert und wie erwartet. Aber was ich versuche zu verstehen, wie fileesEnding Methode mit "_" arbeitet. Ich meine, wenn ich von main aus rufe ich mit Query als Parameter in filesEnding-Methode, die die Funktion an die fileMatching mit "_" übergibt. , dass "_" in fileMatching mit einem String gefüllt wurde, aber wenn ich versuche, mit einem anderen String fileMatching durchzuführen, gibt es einen Kompilierungsfehler, wenn "_" in diesem Fall einen String bedeutet, der mit einem String oder by arbeitet "_" wir sagen dem scala-Compiler, dass dies von woanders/bei der Implementierung aufgefüllt wird.

Jede Detail Erklärung klar sein wird .... Vielen Dank ...

Antwort

1

_.endsWith(query) ist für x => x.endsWith(query) kurz.

1

_ kann als Abkürzung verwendet werden, „den Wert verwenden, ich bin Betrieb auf“, was bedeutet

dies nützlich sein kann: What are all the uses of an underscore in Scala?

In Ihrem Fall ist es durch die anonyme Funktion ersetzt werden könnte: x => x.endsWith(query) , aber da es nicht mehrdeutig ist, können Sie mit scala den syntaktischen Zucker verwenden

1

Beginnen wir mit fileMatching().

def fileMatching(matcher : String => Boolean) = ... 

Das Argument matcher ist eine Funktion, die eine String und gibt eine Boolean nimmt.

Also das muss eine genaue Beschreibung von _.endsWith(query) und _.contains(query) und _.matches(query) sein. All dies sind Funktionen, die eine String, dargestellt durch den Unterstrich, und eine zurückgeben.

Nun, wie wird das matcher Argument verwendet werden?

... if matcher(file.getName) ... 

So file.getName wird die String, dass die _ vertreten, um es in die matcher() Funktion zugeführt wird, und das Boolean Ergebnis wird in der if Klausel getestet.

1

_ ist die Verwendung der Platzhalter-Syntax. Wenn jede Variable in der Lambdasignatur nur Zeit verwendet und jede Variable in der Reihenfolge verwendet wird, die in der Signatur angegeben ist, können Sie jedes Vorkommen der Variablen durch _ ersetzen und die Signatur löschen, da sie nicht mehrdeutig ist.

Da das von Ihnen verwendete Codebeispiel dem Buch "Programmierung in Scala" sehr ähnlich ist, können Sie ein Kapitel auf "8.5 Platzhaltersyntax" zurückführen, wo es im Detail erklärt wird.