/ / Czy scala splat może być używana do wszystkiego, co nie jest varargs? - Scala, ikona, rozwinąć

Czy scala splat może być używana do wszystkiego, co nie jest varargs? - Scala, ikona, rozwinąć

dany np:

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

które mogę normalnie wywołać:

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

lub z ikoną:

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

Ale czy mogę użyć argumentu, by dostarczyć argumenty dla czegokolwiek oprócz parametru varargs? np. chciałbym zrobić coś takiego:

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

To nie działa, ale czy istnieje jakiś sposóbosiągnąć ten sam efekt dostarczania wielu argumentów z jednego obiektu, czy to jest krotka czy coś innego? Czy jest jakiś powód, dla którego to nie może być implementowane dla krotek, biorąc pod uwagę, że zarówno ich długość, jak i typy są znane podczas kompilacji?

Odpowiedzi:

21 dla odpowiedzi № 1

Możesz użyć Function.tupled aby zrobić dokładnie to: włącz funkcję, która trwa n argumenty do funkcji, która bierze jeden krotki argument arii n. Jak można się spodziewać, Function.untupled wykonuje odwrotną pracę.

Specjalny rodzaj opisu : _* ma zastosowanie tylko do powtarzającego się parametru (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 dla odpowiedzi nr 2

Cóż ...

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

da ci pożądane 2|two.