scala – 使用视图时匹配错误
发布时间:2020-12-16 19:11:02 所属栏目:安全 来源:网络整理
导读:List(1,2,3,4).sliding(2).map({ case List(a,b) = a b }).forall(identity) 编译并返回true(尽管警告说匹配并非详尽无遗). List(1,4).view .sliding(2).map({ case List(a: Int,b: Int) = a b }).forall(identity) 编译(只要我们包含a和b的类型注释)但抛出M
List(1,2,3,4).sliding(2).map({ case List(a,b) => a < b }).forall(identity) 编译并返回true(尽管警告说匹配并非详尽无遗). List(1,4).view .sliding(2).map({ case List(a: Int,b: Int) => a < b }).forall(identity) 编译(只要我们包含a和b的类型注释)但抛出MatchError: scala.MatchError: SeqViewC(...) (of class scala.collection.SeqViewLike$$anon$1) at $anonfun$1.apply(<console>:12) at $anonfun$1.apply(<console>:12) at scala.collection.Iterator$$anon$19.next(Iterator.scala:335) at scala.collection.Iterator$class.forall(Iterator.scala:663) at scala.collection.Iterator$$anon$19.forall(Iterator.scala:333) 为什么? 解决方法
有趣的是,列表提取器List.unapplySeq无法提取SeqViewLike对象,这就是为什么会出现匹配错误.但另一方面,Seq可以.你可以这样看:
scala> val seqView = List(1,2).view.sliding(2).next seqView: scala.collection.SeqView[Int,List[Int]] = SeqViewC(...) scala> val List(a,b,_*) = seqView scala.MatchError: SeqViewC(...) scala> val Seq(a,_*) = seqView a: Int = 1 b: Int = 2 所以修复你的第二行将是: List(1,4).view.sliding(2).map({ case Seq(a,b) => a < b }).forall(identity) // res: Boolean = true 所以问题是List(1,4).view返回一个SeqView. 请注意,滑动已经返回一个迭代器,因此List(1,4).sliding(2)是懒惰的.可能是没有必要的观点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |