Ste*_*lis 21 scala pattern-matching
我怎么能压制"匹配并不详尽!" 以下Scala代码中的警告?
val l = "1" :: "2" :: Nil
l.sliding(2).foreach{case List(a,b) => }
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的唯一解决方案是使用其他匹配语句包围模式匹配:
l.sliding(2).foreach{x => (x: @unchecked) match {case List(a,b) => }}
Run Code Online (Sandbox Code Playgroud)
然而,这使得代码不必要地复杂且难以理解.所以必须有一个更短,更可读的替代方案.有人知道吗?
我忘了提到我的列表l在我的程序中至少有2个元素.这就是为什么我可以安全地压制警告.
Ste*_*eve 21
以下是几个选项:
您可以匹配Seq而不是List,因为Seq没有穷举检查(这将失败,就像您的原始,在一个元素列表上):
l.sliding(2).foreach{case Seq(a, b) => ... }
Run Code Online (Sandbox Code Playgroud)你可以使用for comprehension,它会默默地丢弃任何不匹配的东西(所以它在一个元素列表上什么都不做):
for (List(a, b) <- l.sliding(2)) { ... }
Run Code Online (Sandbox Code Playgroud)你可以使用collect,它也会默默地丢弃任何不匹配的东西(如果你需要,你将获得一个迭代器,你需要迭代它):
l.sliding(2).collect{case List(a,b) => }.toList
Run Code Online (Sandbox Code Playgroud)Rex*_*err 20
完成它; case _ => ???是非常短的. ???只是抛出一个例外.如果您使用2.9或之前(2.10中的新功能),您可以定义自己的.
与匹配注释所需的相比,它确实很短:
(: @unchecked)
; case _ => ???
^ One more character!
Run Code Online (Sandbox Code Playgroud)
它不会抛出MatchError,但这真的很重要吗?
| 归档时间: |
|
| 查看次数: |
6287 次 |
| 最近记录: |