如何压制"匹配并不详尽!" Scala中的警告

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

以下是几个选项:

  1. 您可以匹配Seq而不是List,因为Seq没有穷举检查(这将失败,就像您的原始,在一个元素列表上):

    l.sliding(2).foreach{case Seq(a, b) => ... }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你可以使用for comprehension,它会默默地丢弃任何不匹配的东西(所以它在一个元素列表上什么都不做):

    for (List(a, b) <- l.sliding(2)) { ... }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你可以使用collect,它也会默默地丢弃任何不匹配的东西(如果你需要,你将获得一个迭代器,你需要迭代它):

    l.sliding(2).collect{case List(a,b) => }.toList
    
    Run Code Online (Sandbox Code Playgroud)

  • 我不同意这一点.这显然是一种解决方案,但却是一种糟糕的方案.很明显,Seq用于在读取代码时抑制穷举检查. (4认同)
  • 我同意解决方案1和2使得穷举检查被抑制不明显,但解决方案3通过使用`collect`非常明确. (3认同)

Rex*_*err 20

完成它; case _ => ???是非常短的. ???只是抛出一个例外.如果您使用2.9或之前(2.10中的新功能),您可以定义自己的.

与匹配注释所需的相比,它确实很短:

(: @unchecked)
; case _ => ???
              ^  One more character!
Run Code Online (Sandbox Code Playgroud)

它不会抛出MatchError,但这真的很重要吗?

  • 我不喜欢这个解决方案,因为`???`规范地用于表示尚未编写的代码.如果你将它用于其他目的,那么你就混淆了这个含义. (11认同)