/ / Може ли scala splat да се използва за всичко, което не е varargs? - скала, дупка, развъртай

Може ли scala splat да се използва за всичко, което не е varargs? - скала, дупка, развъртай

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

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:_*)

Това не работи, но има ли начин да го направитеда се постигне същият ефект от осигуряването на множество аргументи от един обект, независимо дали става дума за "tuple" или нещо друго? Има ли някаква причина това да не може да бъде изпълнено за типове, като се има предвид, че тяхната дължина и типове са известни при компилиране?

Отговори:

21 за отговор № 1

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

Специалният атрибут на типа : _* е приложима само за повтарящи се параметри (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 за отговор № 2

Е, добре ...

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

ще ви даде желаното 2|two.