Sei que essa pergunta surgiu muitas vezes de maneiras diferentes. Mas ainda não está claro para mim. Existe uma maneira de conseguir o seguinte.
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
batedor
fonte
fonte
Respostas:
É um procedimento de duas etapas. Primeiro transforme foo em uma função e, em seguida, chame tupled nele para torná-lo uma função de uma tupla.
fonte
@ dave-griffith está certo.
Você também pode ligar para:
Se você quiser entrar no território de "muito mais informações do que eu pedi", também existem métodos embutidos em funções parcialmente aplicadas (e
Function
ativadas) para currying. Alguns exemplos de entrada / saída:Onde a versão curried é invocada com múltiplas listas de argumentos:
Por fim, você também pode reduzir a pressa / desacelerar, se necessário.
Function
tem builtins para isso:fonte
Function.tupled(foo _)(getParams)
ou aquele sugerido por Dave.EDITAR:
Para responder ao seu comentário:
Nesse caso, esse truque não funcionará.
Você pode escrever um método de fábrica no objeto companheiro de sua classe e, em seguida, obter a versão tuplada de seu
apply
método usando uma das técnicas acima mencionadas.Com
case class
es, você obtém um objeto companheiro com umapply
método gratuitamente e, portanto, essa técnica é mais conveniente para usar comcase class
es.Eu sei que é muita duplicação de código, mas, infelizmente ... não temos macros (ainda)! ;)
fonte
Person.tupled(("Rahul", "G"))
É útil fazer isso também em objetos companheiros escritos à mão.Agradeço algumas das outras respostas que foram mais próximas do que você pediu, mas achei mais fácil para um projeto atual adicionar outra função que converte parâmetros de tupla em parâmetros de divisão:
fonte
Agora, você pode implementar foo e torná-lo um parâmetro da classe Tuple2 como tal.
fonte