4

我有以下内容:

samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}

我知道单个“案例”将匹配所有可能的值,但我收到“匹配并非详尽无遗”警告。Scala 书解释了将 @unchecked 注释放在普通完全指定的匹配表达式上的位置,但不适用于上面的形式。如何注释上述内容以阻止编译器抱怨?

4

3 回答 3

12

@unchecked只为匹配操作中的选择定义,不为任意函数定义。所以你可以

foreach{ x => (x: @unchecked) => x match { case List(a,b) => ... } }

但这有点拗口。

或者,您可以创建一种方法,将部分函数不安全地转换为完整函数(实际上只是转换为 的函数超类PartialFunction):

def checkless[A,B](pf: PartialFunction[A,B]): A => B = pf: A => B

然后你可以

samples.sliding(2).foreach(checkless{
  case List(a,b) => printf("%x %x\n", a.value, b.value)
})

并且您没有任何警告,因为它期待一个部分功能。

于 2012-05-08T22:50:11.070 回答
0

不知道@unchecked,但为什么不直接调用x.headand x.tail.heador x(0)and x(1)呢?

于 2012-05-08T23:13:23.990 回答
-2

如果您确定它永远不会发生,为什么不添加一个虚拟案例?

samples.sliding (2).foreach {
  case List (a, b) => printf ("%x %x\n", a.value, b.value)
  case _           => sys.error ("impossible")
}
于 2012-05-08T22:29:48.993 回答