加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

可以将scala splat用于任何不是varargs的东西吗?

发布时间:2020-12-16 09:18:46 所属栏目:安全 来源:网络整理
导读:给出例如: scala def pipes(strings:String*) = strings.toList.mkString("|") 我可以正常地打电话: scala pipes("foo","bar")res1: String = foo|bar 或与spl at: scala val args = List("a","b","c")scala pipes(args:_*)res2: String = a|b|c 但是我可
给出例如:

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

我可以正常地打电话:

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

或与spl at:

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个参数转换为需要单个元组参数为arity n的函数的函数.可以预期的是,Function.untupled做相反的工作.

特殊类型归属:_ *仅适用于重复参数(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,"two")
args: (Int,String) = (1,two)

scala> tupledPipeItAfterIncrementing(args)
res0: java.lang.String = 2|two

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读