微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

| 给定例如:
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
但是我可以使用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个元组参数的函数。不出所料,ѭ5做相反的工作。 特殊类型名称“ 6”仅适用于重复参数(又称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
    ,好吧...
scala> def pipeItAfterIncrementing(i:Int,s:String) = (i + 1) + \"|\" + s
scala> val args:Tuple2[Int,\"two\")
scala> (pipeItAfterIncrementing _).tupled(args)
将给您所需的
2|two
。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。