Rust:match语句中转换EtherType::Arp为u16编译报错求解决
解决match语句中EtherType枚举转u16并匹配的问题
你的代码编译报错是因为Rust的match模式语法不允许在分支模式中直接使用as进行类型转换,as只能用于表达式上下文,而模式是用来匹配值结构的,不能包含这类转换操作。结合etherparse库中EtherType可转换为u16的特性,提供以下两种可行方案:
方案一:先转换为u16再匹配
先将枚举值转换为u16类型,再匹配对应枚举值的u16表示:
match deserialized_packet.payload_ether_type() { Some(payload_type) => { // 利用Into trait将EtherType转为u16 let payload_u16: u16 = payload_type.into(); match payload_u16 { // 将EtherType::Arp转为u16作为匹配值 u16::from(EtherType::Arp) => { // 编写ARP包的处理逻辑 }, _ => continue } }, None => continue, }
方案二:使用匹配守卫(Match Guard)
在match分支中通过守卫条件判断转换后的值:
match deserialized_packet.payload_ether_type() { Some(payload_type) => match payload_type { // 用守卫条件判断当前枚举转u16后是否等于ARP的对应值 t if u16::from(t) == u16::from(EtherType::Arp) => { // 编写ARP包的处理逻辑 }, _ => continue }, None => continue, }
两种方案都能实现你想要的枚举写法,其中方案一逻辑更清晰,可读性更强;方案二则无需额外变量,适合简单场景。
内容的提问来源于stack exchange,提问作者x9z78dot
相关产品推荐
相关产品推荐

