Можно ли использовать scala splat для всего, что не является varargs? - PullRequest
14 голосов
/ 13 апреля 2011

дано, например:

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

, который я могу назвать обычно:

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

или со знаком:

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

Но могу ли я использовать восклицательный знак для предоставления аргументов для чего угодно, кроме параметра varargs? например, я хотел бы сделать что-то вроде:

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

Это не работает, но есть ли способ достичь того же эффекта, предоставляя несколько аргументов от одного объекта, будь то кортеж или что-то еще? Есть ли какая-либо причина, по которой это не может быть реализовано для кортежей, учитывая, что их длина и типы известны во время компиляции?

Ответы [ 2 ]

21 голосов
/ 13 апреля 2011

Вы можете использовать Function.tupled, чтобы сделать именно это: превратить функцию, которая принимает n аргументов, в функцию, которая принимает один аргумент кортежа arity n .Как и следовало ожидать, Function.untupled выполняет обратную работу.

Специальная надпись типа : _* применима только для повторного параметра (он же 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 голосов
/ 13 апреля 2011

Ну вроде ...

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

даст вам желаемое 2|two.

...