Scala оператор сплата только для части списка параметров - PullRequest
1 голос
/ 29 марта 2020

Python 3 разрешит повторяющуюся распаковку, например:

>>> def foo(a, b, c): return a + b + c
... 
>>> s1 = "one"
>>> s2 = ("two", "three")
>>> foo(s1, *s2)
'onetwothree'

Я видел Как применить функцию к кортежу? и scala распаковка кортежа но у меня проблемы с эмуляцией в Scala (2.13):

scala> def foo(a: String, b: String, c: String): String = a + b + c
foo: (a: String, b: String, c: String)String

scala> val s1 = "one"
s1: String = one

scala> val s2 = Seq("two", "three")
s2: Seq[String] = List(two, three)

Как я могу имитировать c foo(s1, s2: _*)?

Ближайшее, что я получил, это с этой комбинацией uncurried/curried, но, честно говоря, я не совсем понимаю, почему эта последняя попытка не работает:

scala> Function.uncurried((foo _).curried(s1))
res17: (String, String) => String = scala.Function$$$Lambda$897/0x0000000801070840@145f1f97

scala> Function.uncurried((foo _).curried(s1))(s2(0), s2(1))
res19: String = onetwothree

scala> Function.uncurried((foo _).curried(s1))(s2: _*)
                                              ^
       error: not enough arguments for method apply: (v1: String, v2: String)String in trait Function2.
       Unspecified value parameter v2.

1 Ответ

3 голосов
/ 29 марта 2020

Если бы s2 был кортежем, все было бы довольно просто.

def foo(a:String, b:String, c:String) :String = a + b + c
val s1 = "one"

val s2 = ("two", "three")
(foo(s1, _, _)).tupled(s2)  //res0: String = onetwothree

Но как Seq() я думаю, лучшее, что вы можете сделать, - это обертка, которая распаковывает элементы для вас.

def foox(ss:String*) :String = foo(ss(0), ss(1), ss(2))  //danger

val s3 = Seq("two", "three")
foox(s1 +: s3 :_*)  //res1: String = onetwothree

Нет простого способа (о котором я знаю) перевести метод без varargs на метод / функцию varargs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...