дадени например:
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
.