2016-07-10 19 views
1

Ich habe die folgenden zwei Verfahren in Scala:Verschiedene Syntax für Funktionen in Scala

def myFunc: Int => String = { age => 
    "Here " + age 
} 

def myFunc2 (age: Int) : String = { 
    "Here" + age 
} 

Gibt es einen Unterschied in diesen beiden Methoden? (außer den Namen natürlich). Die Syntax sieht ganz anders aus als ich. Ist es nur eine Frage des Stils? Wird der eine dem anderen vorgezogen?

+1

Sie haben hier keine Funktionen. Dies sind Methoden. Einer von ihnen * ergibt * eine Funktion, und Sie könnten diese in Funktionen umwandeln, aber der Code, den Sie gepostet haben, definiert nur Methoden. – user2357112

+0

Ok - guter Punkt. Ich habe die Terminologie korrigiert. Gibt es einen Unterschied bei den beiden Methoden? – Hutch

Antwort

3

Ja, es gibt einen Unterschied. Ersteres ist eine Methode, die keine Argumente annimmt und eine Funktion vom Typ Function1[Int, String] zurückgibt. Letzteres ist ein Verfahren, das eine String und eine Int zurückgibt. In Scala können Methoden mit Arity-0 ohne Klammern deklariert und aufgerufen werden, so dass das Aufrufen von myFunction(1) und myFunction2(1) gleich aussieht.

Wenn wir beide Methoden-Funktionen umwandeln würde, Sie den Unterschied in der Tatsache sehen würde, dass der ehemalige die Form Function0[Function1[Int, String]] nehmen würde, während die letzteren Function1[Int, String] wäre:

myFunc: Int => String 
myFunc2: (age: Int)String 

scala> myFunc _ 
res6:() => Int => String = <function0> 

scala> myFunc2 _ 
res7: Int => String = <function1> 
+0

Ich denke, Sie könnten die Begriffe "ehemalige" und "letztere" verwechselt haben. – user2357112

+0

@ user2357112 Yup, du hast Recht. Repariert das, danke! –