【发布时间】:2012-05-08 22:22:19
【问题描述】:
我有以下几点:
samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}
我知道单个“案例”将匹配所有可能的值,但我收到“匹配并非详尽无遗”警告。 Scala 书解释了将 @unchecked 注释放在普通完全指定的匹配表达式上的位置,但不适用于上面的形式。如何注释上述内容以阻止编译器抱怨?
【问题讨论】:
我有以下几点:
samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)}
我知道单个“案例”将匹配所有可能的值,但我收到“匹配并非详尽无遗”警告。 Scala 书解释了将 @unchecked 注释放在普通完全指定的匹配表达式上的位置,但不适用于上面的形式。如何注释上述内容以阻止编译器抱怨?
【问题讨论】:
@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)
})
你没有任何警告,因为它期待一个部分功能。
【讨论】:
不知道@unchecked,但为什么不直接打电话给x.head 和x.tail.head 或x(0) 和x(1)?
【讨论】:
如果您确定它永远不会发生,为什么不添加一个虚拟案例?
samples.sliding (2).foreach {
case List (a, b) => printf ("%x %x\n", a.value, b.value)
case _ => sys.error ("impossible")
}
【讨论】: