2017-02-19 13 views
0

Ich bin neu in Scala, ich verstehe diesen Code nicht weiter unten.Wie scala zu verstehen Platzhalter

  • für // 1, was ist das => Boolean? der "Matcher" ist der selbe wie der in // 2?

  • in // 3, warum gibt es zwei Platzhalter _?

Code:

def filesMatching(query: String, matcher: (String, String) => Boolean //1) = { 
    for (
    file <- filesHere; // filesHere is a function that returns an Array of files 
    if matcher(file.getName, query) //2 
) yield file 
} 
def filesEnding(query: String) = 
    filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query)) 

def filesRegex(query: String) = 
    filesMatching(query, _.matches(_) //3) 

Code ist von hier: https://mbonaci.github.io/scala/

Dank

Antwort

0

Für (1), filesMatching ist eine Funktion, die zwei Argumente nimmt, der eine ein String genannt query und der andere eine Funktion (String, String) => Boolean, dh eine Funktion ein Paar von Saiten zu nehmen und zurückkehr ein boolescher Wert, matcher genannt.

In (2) ist diese Funktion mit den Zeichenfolgen wird file.getName genannt und query als Argumente, die durch die if verwendet Boolean zurückkehrt.

Das hinterlässt uns die zwei Unterstriche in (3). Es gibt eine Reihe von Möglichkeiten, wie Unterstriche in Scala verwendet werden, die im Grunde genommen "Ich brauche keinen Namen für diese Sache". Hier ist es eine Verkürzung der anonymen Funktionssyntax. Denken Sie daran, dass das zweite Argument von filesMatching eine Funktion ist, die zwei String s benötigt. Wir schreiben könnte es als

def filesRegex(query: String) = filesMatching(query, (a, b) => a.matches(b)) 

Mit anderen Worten, die erste _ ist ein Platzhalter für das erste Argument und die zweite _ ist ein Platzhalter für das zweite Argument.

+0

dann kann filesEnding dazu umgeschrieben werden? def filesEnding (Abfrage: String) = filesMatching (Abfrage, _.endsWith (_)) – user1615666

0

Diese eine Funktion darstellt, die zwei Parameter vom Typ String nimmt und gibt einen Booleschen:

(String, String) => Boolean 

Zum Beispiel, hier wir filesMatching mit einer Funktion aufgerufen wird, die mit dem zweiten String, wenn der erste String endet prüft:

filesMatching(query, (fileName: String, query: String) => fileName.endsWith(query)) 

Dieses Argument namens matcher dann im Körper filesMatching verwendet wird. Wie Sie sehen können, erhält er 2 Strings und gibt einen Booleschen:

if matcher(file.getName, query) 

Schließlich ist die _ sind einfach eine Kurzschreibweise für diese Funktion, jede _ zu einem Funktionsparameter entspricht. Die letzte Zeile ist äquivalent zu:

filesMatching(query, (fileName: String, query: String) => fileName.matches(query))