加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 模式匹配的字节数组

发布时间:2020-12-16 18:05:41 所属栏目:安全 来源:网络整理
导读:这无法编译: Array[Byte](...) match { case Array(0xFE.toByte,0xFF.toByte,tail @ _* ) = tail } 但是,我可以编译这个: val FE = 0xFE.toByteval FF = 0xFF.toByte bytes match { Array( FE,FF,tail @ _* ) = tail } 为什么第一种情况不能编译而不是第二
这无法编译:

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,然后在匹配中使用它们.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读