模式匹配字节数组

yak*_*ver 4 scala pattern-matching scala-collections

这无法编译:

Array[Byte](...) match { case Array(0xFE.toByte, 0xFF.toByte, tail @ _* ) => tail }
Run Code Online (Sandbox Code Playgroud)

但是,我可以编译这个:

val FE = 0xFE.toByte
val FF = 0xFF.toByte 
bytes match { Array( FE, FF, tail @ _* ) => tail }
Run Code Online (Sandbox Code Playgroud)

为什么第一种情况不能编译而不是第二种情况?

Rex*_*err 8

配套为目前在Scala中实现不允许你生成你的对手语句中的表达式:你必须要么有一个表达式匹配,但不能同时使用.

因此,如果您在进入匹配之前分配值,那么您拥有的只是一个稳定的标识符,并且匹配正常.但与Scala中几乎所有其他地方不同,你不能用像0xFE.toByteval 这样的表达式替换FE.

类型推断将起作用,因此您可以编写

xs match { case Array(-2, -1, tail) => tail }
Run Code Online (Sandbox Code Playgroud)

因为它从xs文字的类型知道-2并且-1必须是字节值.但是,否则,您通常必须完成您所做的事情:构造您想要匹配的内容,并将它们分配给以大写字母开头的val,然后在匹配中使用它们.

没有非常好的理由说明为什么必须采用这种方式(尽管必须解决何时进行变量赋值以及何时测试相等以及何时进行另一级别的不应用)的问题,但这就是它的方式(现在)是.