2016-04-22 9 views
3

Ich habe ein Tupel, wo ich anonyme Funktionen gespeichert habe, ich möchte sie durchlaufen und ausführen.Ausführen von Funktionen aus einem Tuple in Scala

val functions = ((x:Int, y:Int) => x + y, (x:Int, y: Int) => x - y) 
// I want to execute the anonymous functions in the Tuple 
functions.productIterator.foreach(function => function) 

Leider bin ich nicht in der Lage zu tun

functions.productIterator.foreach(function => function(1, 2)) 

ODER

functions.productIterator.foreach(_(1, 2)) 

was der Ausweg ist.

Antwort

1

productIterator auf eine Tuple liefert Iterator[Any] und nicht Iterator[Function2[Int, Int, Int]] wie Sie erwarten.

+0

Zustimmen, wie gehe ich es in einem solchen Szenario anzugehen; gibt es eine Möglichkeit, einen Mustervergleich durchzuführen und dann die Funktion auszuführen. – bitan

4

Tupel sollen nicht iteriert werden. Die Typen gehen verloren, da jeder Eintrag in einem Tupel ein anderer Typ sein kann und das Typsystem also nur Any (also die Iterator[Any]) annimmt. Der wirkliche Vorschlag ist also, dass wenn Sie iterieren möchten, verwenden Sie eine Sammlung wie Seq oder Set.

Auf der anderen Seite, wenn Sie, die das Tupel enthält Funktionen eines bestimmten Typs wissen , dann können Sie die Typprüfung mit asInstanceOf durch Gießen umgehen, aber das ist nicht empfohlen weil Typprüfung ist dein Freund.

functions.productIterator.map(_.asInstanceOf[(Int,Int)=>Int](1, 2)) 
// produces `Iterator(3, -1)` 

Alternativ haben Sie einen Blick auf HLists in Shapeless, die Eigenschaften der beiden Tupel und Sammlungen haben.

0

Wir können die Elemente des Tupels in eine Seq extrahieren, während Typinformationen erhalten werden; daher

Seq(functions._1, functions._2).map(_(1,2)) 
List(3, -1)