scala - scala splat 可以用于任何不是可变参数的东西吗?

标签 scala splat unroll

给定例如:

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

我可以正常调用:
scala> pipes("foo", "bar")
res1: String = foo|bar

或者用一个splat:
scala> val args = List("a","b","c")
scala> pipes(args:_*)
res2: String = a|b|c

但是我可以使用 splat 来为除了 varargs 参数之外的任何东西提供参数吗?例如,我想做类似的事情:
scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
scala> val args:Tuple2[Int, String] = (1, "two")
scala> pipeItAfterIncrementing(args:_*)

这是行不通的,但是有什么方法可以实现从单个对象提供多个参数的相同效果,无论是元组还是其他东西?鉴于元组的长度和类型在编译时已知,是否有任何原因不能为元组实现?

最佳答案

您可以使用 Function.tupled要做到这一点:将一个接受 n 个参数的函数变成一个接受 n 个元组参数的函数。正如所料,Function.untupled做相反的工作。

特殊类型归属: _*仅适用于重复参数(又名可变参数)。

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

关于scala - scala splat 可以用于任何不是可变参数的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649414/

相关文章:

ruby - 哈希解构

loops - 如果行程计数不是恒定的,为什么#pragma-unrolled循环的性能会降低?

c - 告诉 gcc 专门展开一个循环

scala - 在 Yarn UI 中将 Spark 作业标记为失败

scala - 如何使用 Intellij Idea 使用 Apache Spark?

mysql - Scala Slick : MTable. getTables 返回空向量/列表

ruby - 将 splat 传递给 nil 作为参数

Ruby splat 用法

c - 告诉 gcc 专门展开一个循环

json - 将大型多嵌套 json 解析为 scala 案例类