这无法编译:
Array[Byte](...) match { case Array(0xFE.toByte,0xFF.toByte,tail @ _* ) => tail }
但是,我可以编译这个:
val FE = 0xFE.toByte val FF = 0xFF.toByte bytes match { Array( FE,FF,tail @ _* ) => tail }
为什么第一种情况不能编译而不是第二种情况?
解决方法
当前在Scala中实现的匹配不允许您在匹配语句中生成表达式:您必须具有表达式或匹配项,但不能同时具有两者.
因此,如果您在进入匹配之前分配值,那么您拥有的只是一个稳定的标识符,并且匹配正常.但与Scala中几乎所有其他地方不同,您不能将像0xFE.toByte这样的表达式替换为val FE.
类型推断将起作用,因此您可以编写
xs match { case Array(-2,-1,tail) => tail }
因为它从xs的类型知道文字-2和-1必须是字节值.但是,否则,您通常必须完成您所做的事情:构造您想要匹配的内容,并将它们分配给以大写字母开头的val,然后在匹配中使用它们.
没有非常好的理由说明为什么它必须采用这种方式(尽管必须解决何时进行变量赋值以及何时测试相等以及何时进行另一级别的不应用)的问题,但这就是它的方式(现在)是.