2017-05-01 7 views
0

Ich möchte einer Variablen eine bestehende Funktion zuweisen. Nach this Seite ist es so einfach wie:Bestehende Funktion der Variablen zuweisen

val p = scala.math.pow(_, _) 
pow: (Double, Double) => Double = <function2> 

aber wenn ich versuche, die gleiche Sache in meinem Code zu tun, funktioniert es nicht.

def main(args: Array[String]) = { 
    val p = scala.math.min(_, _) 
    val func = if (args(0).equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_) 
} 

dachte ich, das vielleicht durch die Verwendung von if und else Zustand in derselben Zeile, aber ich Fehlermeldung erhalten, wenn der Wert der Variablen p auch zuweisen.

Fehler erhalte ich:

Parametertyp fehlt für eine erweiterte Funktion ((x 1 $, x $ 2) => scala.math.min (x $ 1, x $ 2))

Warum funktioniert es nicht für mich und wie kann ich es beheben?

+1

'val p = scala.math.min _' – dmitry

+0

@dmitry Warum benötigt Powder 2 Unterstriche und min und max nur 1? Wie weißt du, ob 1 Unterstrich ausreicht? –

+0

Ich würde empfehlen, die oben gewählte Antwort hier zu lesen, insbesondere das Endsegment. Auch scala.math.pow _ einzelner Unterstrich funktioniert genauso gut. Die kurze Antwort zu wissen, was ausreichend ist, ist zu sehen, ob es erfolgreich kompiliert :) http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-andunderscore-in-scala – Tanjin

Antwort

2

der Typ-Parameter müssen für Ihre func definiert werden:

val func: (Int, Int) => Int = if (args.head.equalsIgnoreCase("min")) math.min(_,_) else math.max(_,_) 

Alternativ als Benutzer dmitrij wies darauf hin, einen einzigen Unterstrich:

val func = if (args.head.equalsIgnoreCase("min")) math.min _ else math.max _ 

aber es scheint, als ob Sie ein Anfänger auf das sind Sprache - persönlich würde ich genau wie im ersten Beispiel die Interessensgebiete üben, bis Sie die Dinge besser im Griff haben.

+0

Ja , begann heute zu lernen! –

1

Es gibt nur eine einzige scala.math.pow Methode, aber es gibt mehrere Überlastungen von min und max: def min(x: Double, y: Double): Double, def min(x: Int, y: Int): Int usw. Ohne erwartete Argument Art zu schaffen, kann Scala wissen nicht, welche Sie meinen. Ich würde z.B. val p = scala.math.min(_: Int, _: Int) oder val p = scala.math.min(_: Double, _: Double) (oder Sie können den Typ von direkt wie in Tanjins Antwort angeben).

val p = min _ passiert zu arbeiten, weil die min(x: Int, y: Int) Überladung ist die spezifischste, aber ich denke, es ist eine schlechte Idee, darauf beim Start zu verlassen.

Verwandte Themen