2011-04-13 19 views
14

ejemplo dado:¿Se puede usar scala splat para cualquier cosa que no sea varargs?

scala> def pipes(strings:String*) = strings.toList.mkString("|") 

cual puedo llamar normalmente:

scala> pipes("foo", "bar") 
res1: String = foo|bar 

o con un splat:

scala> val args = List("a","b","c") 
scala> pipes(args:_*) 
res2: String = a|b|c 

Pero puedo utilizar un splat de proporcionar argumentos para nada más que una ¿parámetro varargs? por ejemplo me gustaría hacer algo como:

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> pipeItAfterIncrementing(args:_*) 

eso no funciona, pero ¿hay alguna manera de conseguir el mismo efecto de proporcionar múltiples argumentos de un solo objeto, ya sea una tupla o alguna otra cosa? ¿Hay alguna razón para que esto no pueda implementarse para tuplas, dado que tanto su longitud como sus tipos son conocidos en tiempo de compilación?

Respuesta

21

Puede utilizar Function.tupled para hacer exactamente esto: a su vez una función que toma n argumentos en una función que toma un solo argumento tupla de aridad n . Como se puede esperar, Function.untupled hace el trabajo inverso.

La asignación de tipo especial : _* solo es aplicable para el parámetro repetido (a.k.a. varargs).

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
pipeItAfterIncrementing: (i: Int,s: String)java.lang.String 

scala> def tupledPipeItAfterIncrementing = Function.tupled(pipeItAfterIncrementing _) 
tupledPipeItAfterIncrementing: ((Int, String)) => java.lang.String 

scala> val args:Tuple2[Int, String] = (1, "two") 
args: (Int, String) = (1,two) 

scala> tupledPipeItAfterIncrementing(args) 
res0: java.lang.String = 2|two 
12

Bien tipo de ...

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> (pipeItAfterIncrementing _).tupled(args) 

le dará la 2|two deseada.

+0

buena respuesta, me temo que JPP simplemente te adelantó;) – gfxmonk

+0

Se te permite (y te alienta) a enviar múltiples respuestas. Solo "aceptar" se reduce a una respuesta. –

+0

Además, su respuesta también muestra que 'tupled' también es un método en instancias' Function' además del que está en el objeto 'Function'. –

Cuestiones relacionadas