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

Scala:toSeq vs Seq(某事:_ *)

发布时间:2020-12-16 10:03:44 所属栏目:安全 来源:网络整理
导读:我写了一个名为extract的函数,定义如下: def extract(params: String): Seq[String] = { val result = params.split(",") map (param = param.trim()) result toSeq} 然后我对提取结果执行模式匹配,如下所示: extract(myInputString) match { case Nil = /
我写了一个名为extract的函数,定义如下:

def extract(params: String): Seq[String] = {
  val result = params.split(",") map (param => param.trim())
  result toSeq
}

然后我对提取结果执行模式匹配,如下所示:

extract(myInputString) match {
  case Nil => // do something
  case head :: Nil => // do something
  case head :: tail => // do something
}

每当我的模式匹配大小写Nil =>分支,我得到了

scala.MatchError: WrappedArray(T) (of class scala.collection.mutable.WrappedArray$ofRef)

另一方面,如果我在提取函数中用Seq(result:_ *)替换结果toSeq,一切正常.

有人能解释一下这种行为吗?

解决方法

Nil和::是仅匹配List类型实例的提取器.您正在传递一个Seq,这是一个更一般的特征,可能是也可能不是List.

使用Seq(…)构造Seq时,Scala默认构建List.同样不能说toSeq,它通常将底层集合封装在最合适的Seq接口中.例如,Iterator.toSeq产生一个Stream,而Array.toSeq产生一个WrappedArray.

这就是为什么你的代码在调用seq时不起作用的原因; String.split产生一个Array(它是原始Java String类中的一个方法),map保持其类型.您可以添加一个案例来处理Seq的实例,也可以让您的extract方法返回一个List.

(编辑:李大同)

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

    推荐文章
      热点阅读