Ich weiß, dass diese Frage oft auf unterschiedliche Weise gestellt wurde. Aber es ist mir immer noch nicht klar. Gibt es eine Möglichkeit, Folgendes zu erreichen?
def foo(a:Int, b:Int) = {}
foo(a,b) //right way to invoke foo
foo(getParams) // is there a way to get this working without explicitly unpacking the tuple??
def getParams = {
//Some calculations
(a,b) //where a & b are Int
}
scala
parameters
tuples
erkunden
quelle
quelle
Antworten:
Es ist ein zweistufiges Verfahren. Verwandeln Sie zuerst foo in eine Funktion und rufen Sie dann tupled auf, um es zu einer Funktion eines Tupels zu machen.
quelle
@ Dave-Griffith ist tot auf.
Sie können auch anrufen:
Wenn Sie in das Gebiet "viel mehr Informationen als gewünscht" eintauchen möchten, gibt es auch Methoden, die in teilweise angewendete Funktionen (und weiter
Function
) zum Currying integriert sind. Einige Beispiele für Eingabe / Ausgabe:Wobei die Curry-Version mit mehreren Argumentlisten aufgerufen wird:
Schließlich können Sie bei Bedarf auch entkorken / entkoppeln.
Function
hat eingebaute dafür:quelle
Function.tupled(foo _)(getParams)
oder der von Dave vorgeschlagene.BEARBEITEN:
Um auf Ihren Kommentar zu antworten:
In diesem Fall funktioniert dieser Trick nicht.
Sie können eine Factory-Methode in das Begleitobjekt Ihrer Klasse schreiben und dann die tupelige Version ihrer
apply
Methode mithilfe einer der oben genannten Techniken abrufen .Mit
case class
es erhalten Sie ein Begleitobjekt mit einerapply
kostenlosen Methode, und daher ist diese Technik mitcase class
es bequemer zu verwenden .Ich weiß, dass das eine Menge Code-Duplizierung ist, aber leider ... haben wir (noch) keine Makros! ;)
quelle
Person.tupled(("Rahul", "G"))
Es ist praktisch, dies auch in handgeschriebenen Begleitobjekten zu tun.Ich schätze einige der anderen Antworten, die näher an Ihren Anforderungen lagen, aber ich fand es für ein aktuelles Projekt einfacher, eine weitere Funktion hinzuzufügen, die Tupelparameter in geteilte Parameter konvertiert:
quelle
Jetzt können Sie foo implementieren und dafür sorgen, dass ein Parameter der Tuple2-Klasse wie folgt verwendet wird.
quelle