Sé que esta pregunta ha surgido muchas veces de diferentes maneras. Pero todavía no lo tengo claro. ¿Hay alguna manera de lograr lo siguiente?
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
explorar
fuente
fuente
Respuestas:
Es un procedimiento de dos pasos. Primero convierta foo en una función, luego llame a tupled para que sea una función de una tupla.
fuente
@ dave-griffith está seguro.
También puedes llamar al:
Si quieres adentrarte en un territorio de "mucha más información de la que pedí", también hay métodos integrados en funciones parcialmente aplicadas (y otras
Function
) para currying. Algunos ejemplos de entrada / salida:Donde la versión curry se invoca con múltiples listas de argumentos:
Por último, también puede deshacer / deshacer el tuplo si es necesario.
Function
tiene incorporados para esto:fuente
Function.tupled(foo _)(getParams)
o el sugerido por Dave.EDITAR:
Para responder a su comentario:
En ese caso, este truco no funcionará.
Puede escribir un método de fábrica en el objeto complementario de su clase y luego obtener la versión tuplicada de su
apply
método utilizando una de las técnicas mencionadas anteriormente.Con
case class
es obtienes un objeto complementario con unapply
método gratis y, por lo tanto, esta técnica es más conveniente para usar concase class
es.Sé que es mucha duplicación de código, pero por desgracia ... ¡no tenemos macros (todavía)! ;)
fuente
Person.tupled(("Rahul", "G"))
Es útil hacer esto también en objetos complementarios escritos a mano.Aprecio algunas de las otras respuestas que estaban más cerca de lo que solicitó, pero me resultó más fácil para un proyecto actual agregar otra función que convierte los parámetros de tupla en los parámetros de división:
fuente
Ahora, puede implementar foo y hacer que tome un parámetro de la clase Tuple2 como tal.
fuente