Is there a Scala equivalent of the Python list unpack (a.k.a. “*”) operator?

╄→尐↘猪︶ㄣ 提交于 2019-12-03 04:38:19
Jens Schauder

There is something similar for functiones: tupled It converts a function that takes n parameters into a function that takes one argument of type n-tuple.

See this question for more information: scala tuple unpacking

Such a method for arrays wouldn't make much sense, because it would only work with functions with multiple arguments of same type.

There is no direct equivalent in scala. The closest thing you will find is the usage of _*, which works on vararg methods only. By example, here is an example of a vararg method:

def hello( names: String*) {
  println( "Hello " + names.mkString(" and " ) )
}

which can be used with any number of arguments:

scala> hello()
Hello
scala> hello("elwood")
Hello elwood
scala> hello("elwood", "jake")
Hello elwood and jake

Now, if you have a list of strings and want to pass them to this method, the way to unpack it is through _*:

scala> val names = List("john", "paul", "george", "ringo")
names: List[String] = List(john, paul, george, ringo)
scala> hello( names: _* )
Hello john and paul and george and ringo    

You can get some way towards the Python using shapeless,

Welcome to Scala version 2.11.0-20130208-073607-ce32c1af46 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_05).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import shapeless._
import shapeless._

scala> import Traversables._
import Traversables._

scala> case class ThreeValues(one: String, two: String, three: String)
defined class ThreeValues

scala> val argList = List("one","two","three")
argList: List[String] = List(one, two, three)

scala> argList.toHList[String :: String :: String :: HNil].map(_.tupled).map(ThreeValues.tupled)
res0: Option[ThreeValues] = Some(ThreeValues(one,two,three))

As you can see, a little more ceremony is required in Scala with shapeless. This is because shapeless imposes compile time constraints which are guaranteed to be satisfied at runtime (unlike the python, which will fail at runtime if args is the wrong size or contains elements of the wrong type) ... instead you're forced to specify the type you expect the List to have (in this case exactly three Strings) and be prepared to handle the case where that expectation isn't satisfied (because the result is explicitly an Option of ThreeValues).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!