2017-01-05 2 views
3

In dem folgenden Code, was ist die Klassifizierung (oder technischer Name) der Verwendung des Unterstrichs?Was ist die Verwendung von _ in Int => Int = _ + 1

scala> def f: Int => Int = _ + 1 
f: Int => Int 

scala> f(2) 
res0: Int = 3 
+2

Platzhalter. Siehe http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-andunderscore-in-scala – YoungSpice

Antwort

10

Von Functional Programming in Scala

... manchmal Strich Syntax für eine Funktionsliteral genannt, sind wir nicht einmal das Argument an die Funktion zu nennen stört, mit _ stellen das einzige Argument. Wenn dieser Notation können wir nur den Funktionsparameter Referenz einmal im Körper der Funktion (wenn wir _ wieder erwähnen, bezieht er sich auf ein anderes Argument an die Funktion)

In Ihrem Fall tun:

def f: Int => Int = _ + 1 

würde das gleiche wie sein:

def f: Int => Int = x => x + 1 

die unnötig erscheinen mag, wird aber ziemlich praktisch für höhere anonyme Funktionen vorbei geordnete Funktionen (die Funktionen sind, die Funktionen als Argumente):

def higherOrder(f: Int => Int) = { /* some implementation */ } 

// Using your function you declared already 
higherOrder(f) 

// Passing an anonymous function 
higherOrder((x: Int) => x + 1) 
higherOrder((x) => x + 1) 
higherOrder(x => x + 1) 

// Passing an anonymous function with underscore syntax 
higherOrder(_ + 1) 
0

Betrachten Sie es als eine Eingabe, die durch den Anrufer geliefert werden

scala> def incrementByOne: Int => Int = _ + 1 
incrementByOne: Int => Int 

Was yo ist wieder eine Funktion, nimmt Int und gibt eine Int zurück.

X => Y 

In Rückgabetyp bedeutet eine Funktion, den Typen X als Eingabe- und Rückgabetyp Y als Ausgang nehmen. jetzt X und Y könnte jeder Typ sein.

das Beispiel zu vervollständigen, würden Sie es als

scala> incrementByOne(10) 
res0: Int = 11 

scala> incrementByOne(99) 
res1: Int = 100 

scala> 

die Int als Eingabe nahm nennen (10 und 99) und kehrte Int als Ausgang (11 und 100)

+0

danke für die Klarstellung. Ich suchte nach einem syntaktischen "Namen", wenn der Unterstrich in einer anonymen Funktion verwendet wird. Von der Verbindung, die im 1. Pfosten gegeben wird. [Was nützt ein Unterstrich in Scala?] (Http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-andunderscore-in-scala). Es heißt "Platzhaltersyntax". Nicht wirklich intuitiv, aber es ist OK, solange es einen Namen gibt. – Polymerase

Verwandte Themen