模式匹配字节数组

时间:2015-06-10 22:19:14

标签: scala pattern-matching scala-collections

无法编译:

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 }

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

2 个答案:

答案 0 :(得分:8)

当前在Scala中实现的匹配不允许您在匹配语句中生成表达式:您必须 表达式匹配,但不能同时使用。< / p>

因此,如果您在进入比赛之前分配了值,那么您拥有的只是一个稳定的标识符,并且匹配正常。但与Scala中几乎所有其他地方不同,您无法0xFE.toByte之类的表达式替换为val FE

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

xs match { case Array(-2, -1, tail) => tail }

因为它从xs的类型知道文字-2-1必须是字节值。但是,否则,你经常需要做你所做的事情:构造你想要匹配的东西,并将它们分配给以大写字母开头的val,然后在匹配中使用它们。

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

答案 1 :(得分:-1)

因为您在match中看到的内容不是构造函数,而是extractor。提取器将数据提取到提供的变量中。这就是为什么第二种情况有效 - 你在那里提供变量。顺便说一句,你没有必要提前创建它们。

有关http://docs.scala-lang.org/tutorials/tour/extractor-objects.html

的提取器的更多信息