J'ai réfléchi à la même chose et je suis arrivé à votre question aujourd'hui.
Je n'aime pas beaucoup les approches basées sur les fonctions partielles (tout ce qui a une fonction partielle). case
) puisqu'ils impliquent qu'il pourrait y avoir plus de points d'entrée pour le flux logique. Pour moi en tout cas, ils tendent à brouiller l'intention du code. D'un autre côté, je veux vraiment aller directement aux champs de tuple, comme vous.
Voici une solution que j'ai ébauchée aujourd'hui. Elle semble fonctionner, mais je ne l'ai pas encore essayée en production.
object unTuple {
def apply[A, B, X](f: (A, B) => X): (Tuple2[A, B] => X) = {
(t: Tuple2[A, B]) => f(t._1, t._2)
}
def apply[A, B, C, X](f: (A, B, C) => X): (Tuple3[A, B, C] => X) = {
(t: Tuple3[A, B, C]) => f(t._1, t._2, t._3)
}
//...
}
val list = List( ("a",1), ("b",2) )
val list2 = List( ("a",1,true), ("b",2,false) )
list foreach unTuple( (k: String, v: Int) =>
println(k, v)
)
list2 foreach unTuple( (k: String, v: Int, b: Boolean) =>
println(k, v, b)
)
Sortie :
(a,1)
(b,2)
(a,1,true)
(b,2,false)
Peut-être cela s'avérera-t-il utile. Les unTuple
devrait naturellement être mis de côté dans un espace de noms d'outils.
Addendum :
Appliquée à votre cas :
val m = l.filter( unTuple( (n:Int,color:String) =>
n != 2
))